如何在 Django 中显示相对值?
Posted
技术标签:
【中文标题】如何在 Django 中显示相对值?【英文标题】:How to Dislay Relation value in Django? 【发布时间】:2020-11-09 17:06:30 【问题描述】:我正在使用 Django 管理面板,并且正在为电子商务网站的产品变体进行设置,我在我的数据库中为变体创建了多个表,这些表彼此相关。现在我想在管理面板中显示size
和flavour
,假设有3种尺寸small
、medium
和large
那么它应该显示在我的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
都在单个下拉列表中,但我希望size
和flavour
不同,并且会有2 个下拉列表,一个用于size
,另一个用于flavour
,以及这些选项将来自variant
和variantoption
表,所以请让我知道我可以在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
表格数据'size
和flavour
,但我想要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:如何在给定实际值和选项的情况下访问模板中 ChoiceField 的显示值?