我有一个模型,其中的一个字段是postgres.fields.JSONField。
将要存储的Json中有一个ID可变字典,该字典引用数据库中的其他项(可能的关系/属性)。
请让我更具体一点:
基本上,我正在尝试创建一个折扣系统,其中某些折扣将应用于某些产品。 JSON字段包含了解哪些产品可以享受折扣的约束。
例如:
如果我想对“饮料”类别下的所有产品应用50%的折扣,并且“饮料”类别在数据库中的ID为5
,则折扣记录如下:
discount_type='percent'
discount='0.5'
filter_by={
'category': [5]
}
如果我想对“饮料”类别中的所有产品(并由可口可乐生产)减价20美元,则
filter_by
词典如下所示:discount_type='fixed amount'
discount='20'
filter_by={
'category': [5],
'manufacturer': [2] # Assuming coca-cola is the Manufacturer
# with id==2 in the 'Manufacturers'
# table of the database (NOTE: this is
# needed since CocaCola manufactures
# products besides "Beverages")
}
如果我想对特定产品应用25%的折扣(假设
id
为3
的产品),则字典将如下所示:discount_type='percent'
discount='0.25'
filter_by={
'id': [3]
}
这个想法似乎足够灵活,可以满足我的需求,到目前为止,我对此感到满意。
现在,问题出在如何在
Discount
模型的Django管理区域中输入这些值。正如预期的那样,
filter_by
词典呈现为一个文本字段,最初看起来像这样:如果要向其中添加字段,则需要编写所需内容的确切JSON...。这意味着,如果要对“饮料”类别应用折扣,则需要确定该类别的ID在数据库中,然后手动键入
{"category": [5]}
,同时在键入'
,:
时要格外小心,请确保我不会错过]
或[
...Thaaaat ...嗯,那不是很有帮助...
由于我仅要按几个字段(
category
,manufacturer
,product
...)进行过滤,这些字段实际上是数据库中其他元素的ID的列表,因此我想显示一个大的MultiSelect框每个东西我都可以过滤,因此我可以看到一个用户友好的列表,其中列出了可以过滤的所有元素,选择其中的几个元素,然后,当我单击“创建折扣”时,我会得到filter_by
字典(因为我什至不知道如何正确呈现Admin表单,所以仍然不用担心如何生成字典。像Django Admin自动为我的产品类别执行的操作:
那真的非常非常好:一种产品可以属于几类。为此,Django并排渲染了两个
<select multiple
框,其中包含可用的类别以及该产品已经属于的类别...我可以通过单击鼠标来添加/删除类别...确实,非常好。但是Django可以这样做,因为它知道categories
是ManyToMany
模型中的Product
关系。class Product(models.Model):
parent = models.ForeignKey('self', null=True, blank=True)
manufacturer = models.ForeignKey('Manufacturer')
categories = models.ManyToManyField('Category',
related_name='products', blank=True)
Discount
模型的问题是ManyToMany
,category
或manufacturer
没有product
字段。可怜的Django不知道Discount
与所有这些东西有关:它只知道有一个Json
字段。我真的很想能够在Django Area中显示一堆这样的
<select>
,列出可以存储在Category
中的所有可能的过滤器(Manufacturer
,ID
,filter_by
...)字典(一个条目,其中<select>
的双Category
表示数据库中所有可用的类别,一个条目Manufacturer
的所有条目,显示所有可用的制造商...等等)。但是我真的,真的不知道该怎么做。我可以尝试使用
Widgets
做很多尝试,尝试通过form
通过forms.ModelMultipleChoiceField
表示JSON字段(顺便说一下,这似乎是最接近的东西我想要,尽管还很远)...但是我认为这是没有意义的,因为没有什么比我想要的更接近。与往常一样,感谢您阅读这封巨大的电子邮件,并预先感谢您。任何提示将不胜感激,即使只是一个,您也应该看看“这个”
最佳答案
您将需要一些JavaScript,以将json字典放入一个漂亮的HTML小部件中,然后在Django处理程序中对其进行处理。
如果您想使用Django admin的“魔术”,则必须为其提供渲染良好的UI并为折扣系统创建模型所需的输入:
class Discount(models.Model):
discount_type = models.TextField()
discount_percentage = models.FloatField()
class DiscountElement(models.Model):
discount = models.ForeignKey(Discount)
manufacturer = models.ForeignKey(Manufacturer, null=True)
category = models.ForeignKey(Category, null=True)
关于python - Django管理页面:通过多个模型选择而不是原始文本来自定义ID的字典(JSONField),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742903/