Skip to main content
 首页 » 编程设计

python之Django管理页面:通过多个模型选择而不是原始文本来自定义ID的字典(JSONField)

2024年10月01日33mfrbuaa

我有一个模型,其中的一个字段是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)