如何在 Django 中显示相对值?

Posted

技术标签:

【中文标题】如何在 Django 中显示相对值?【英文标题】:How to Dislay Relation value in Django? 【发布时间】:2020-11-09 17:06:30 【问题描述】:

我正在使用 Django 管理面板,并且正在为电子商务网站的产品变体进行设置,我在我的数据库中为变体创建了多个表,这些表彼此相关。现在我想在管理面板中显示sizeflavour,假设有3种尺寸smallmediumlarge那么它应该显示在我的Django管理面板的Size下拉列表中, 和 flavours 的相同过程,但现在所有 sizes 和 `flavors 都在一个下拉列表中,请检查我的代码,让我知道如何解决这个问题。

这是我的models.py 文件

class Variants(models.Model):
    name=models.CharField(max_length=285, default=None)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

这里是变体选项代码,它将存储variation table id

class VariantOptions(models.Model):
    variant=models.ForeignKey('Variants', related_name='var_option', on_delete=models.CASCADE, null=True, blank=True)
    name=models.CharField(max_length=285)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

这是我的skuoption 表格代码

class SkuOption(models.Model):
    product = models.ForeignKey('Product', null=True, blank=True, on_delete=models.CASCADE)
    variantoption=models.ForeignKey('VariantOptions', related_name='sku_option', on_delete=models.CASCADE, null=True, blank=True)
    sku=models.CharField(max_length=285, null=True, blank=True)
    price=models.CharField(max_length=285, null=True, blank=True)
    qty=models.CharField(max_length=285, null=True, blank=True)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.sku

这是我的admin.py 文件代码,我在其中为关系注册模型

class SkuOptionAdmin(admin.TabularInline):
    fieldsets = [(None, 'fields':['sku','price','qty','variantoption'])]
    model = SkuOption

这是我的管理面板图片

我所有的variationoption 都在单个下拉列表中,但我希望sizeflavour 不同,并且会有2 个下拉列表,一个用于size,另一个用于flavour,以及这些选项将来自variantvariantoption 表,所以请让我知道我可以在fieldsets = [(None, 'fields':['sku','price', 'qty','variantoption'])] 的 admin.py 文件中执行哪些代码,这样我就可以获得两个下拉列表。 如果您有新的建议,请与我分享。

【问题讨论】:

【参考方案1】:

将变量外键添加到 skuoption 表,而不是变量选项表:

class VariantOptions(models.Model):
  name=models.CharField(max_length=285)
  created_at=models.DateTimeField(auto_now_add=True)
  updated_at=models.DateTimeField(auto_now=True)

  def __str__(self):
      return self.name


class SkuOption(models.Model):
    product = models.ForeignKey('Product', null=True, blank=True, on_delete=models.CASCADE)
    variant=models.ForeignKey('Variants', related_name='var_option', on_delete=models.CASCADE, null=True, blank=True)
    variantoption=models.ForeignKey('VariantOptions', related_name='sku_option', on_delete=models.CASCADE, null=True, blank=True)
    sku=models.CharField(max_length=285, null=True, blank=True)
    price=models.CharField(max_length=285, null=True, blank=True)
    qty=models.CharField(max_length=285, null=True, blank=True)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.sku

【讨论】:

它给了我variants表格数据'sizeflavour,但我想要variantoption根据variant_id在下拉列表中的表格数据,请看上图,那里是variant_id=1 那么所有sizes 都应该在我的管理面板中的新下拉列表中,如果vriant_id=2 那么所有flavour 都应该在我的管理面板中的新下拉列表中。【参考方案2】:

如果您希望您的属性和属性值是动态的,为了获得不同的大小(属性)和风味(值),我建议您创建一个包含产品、属性和外键的表,如下所示:

  class Attributes(models.Model):
    name = models.CharField(max_length=50, default=None)
    slug = models.SlugField(max_length=200, unique=True,null=True)

class AttributeTerms(models.Model):
    name = models.CharField(max_length=50, blank =True)
    attribute = models.ForeignKey(Attributes, on_delete=models.CASCADE)  

class Products(models.Model):
    name = models.CharField(max_length=250,null=True, blank=True,)
    slug = models.SlugField(max_length=200, unique=True,null=True)
    

class ProductAttribute(models.Model):
    product = models.ForeignKey(Products,on_delete=models.CASCADE, related_name='attributes', default=None)
    attributes = models.ForeignKey(Attributes,on_delete=models.CASCADE, related_name='attributes', default=None)
    values = models.ForeignKey(AttributeTerms, on_delete=models.CASCADE, related_name='attributes', default=None)



class ProductVariant(models.Model):
    product = models.ForeignKey(Products,on_delete=models.CASCADE)
    variant = models.ForeignKey(ProductAttribute,on_delete=models.CASCADE, null = True, default=None)
    stock = models.IntegerField(default=None)
    stock_threshold = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    sku = models.CharField(max_length= 250, default=None)
    sale_price = models.DecimalField(max_digits=10, decimal_places=2)
   
   

在 admin.py

class ProductAttributeInline(admin.TabularInline):
       model = ProductAttribute


class ProductVariationInline(admin.TabularInline):
       model = ProductVariant
       
       
class ProductVariant(admin.ModelAdmin):
   inlines = [ProductAttributeInline,
              ProductVariationInline,
              ]

admin.site.register(Products, ProductVariant)

【讨论】:

以上是关于如何在 Django 中显示相对值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板中显示数组值?

如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期)

Django:如何在给定实际值和选项的情况下访问模板中 ChoiceField 的显示值?

Python - 如何在 django 模板中为所有值并排显示两个键的字典值

如何在Django模板中显示数组值?

如何使 ManyToMany 字段的值显示在 Django 通用 DeleteView 中