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

标签 python django django-admin customization django-jsonfield

我有一个模型,其中的一个字段是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%的折扣(假设id3的产品),则字典将如下所示:

discount_type='percent'
discount='0.25'
filter_by={
    'id': [3]
}



这个想法似乎足够灵活,可以满足我的需求,到目前为止,我对此感到满意。



现在,问题出在如何在Discount模型的Django管理区域中输入这些值。

正如预期的那样,filter_by词典呈现为一个文本字段,最初看起来像这样:

enter image description here

如果要向其中添加字段,则需要编写所需内容的确切JSON...。这意味着,如果要对“饮料”类别应用折扣,则需要确定该类别的ID在数据库中,然后手动键入{"category": [5]},同时在键入':时要格外小心,请确保我不会错过][ ...

Thaaaat ...嗯,那不是很有帮助...

由于我仅要按几个字段(categorymanufacturerproduct ...)进行过滤,这些字段实际上是数据库中其他元素的ID的列表,因此我想显示一个大的MultiSelect框每个东西我都可以过滤,因此我可以看到一个用户友好的列表,其中列出了可以过滤的所有元素,选择其中的几个元素,然后,当我单击“创建折扣”时,我会得到filter_by字典(因为我什至不知道如何正确呈现Admin表单,所以仍然不用担心如何生成字典。

像Django Admin自动为我的产品类别执行的操作:

enter image description here

那真的非常非常好:一种产品可以属于几类。为此,Django并排渲染了两个<select multiple框,其中包含可用的类别以及该产品已经属于的类别...我可以通过单击鼠标来添加/删除类别...确实,非常好。但是Django可以这样做,因为它知道categoriesManyToMany模型中的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模型的问题是ManyToManycategorymanufacturer没有product字段。可怜的Django不知道Discount与所有这些东西有关:它只知道有一个Json字段。

我真的很想能够在Django Area中显示一堆这样的<select>,列出可以存储在Category中的所有可能的过滤器(ManufacturerIDfilter_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/

相关文章:

Python如何获取实例的基础实例?

Python:在另一个数据框的标题中查找值并替换/映射相应的值

python - 使用 SWIG Controller 将 python 中的 numpy 函数传递给 C++

django - 如何自定义Django中的默认身份验证系统?

python - numpy 数组中元素 i 和 i+1 的平均值

Elastic Beanstalk 上的 Django Weasyprint - 无法加载 GDK-Pixbuf

python - Django 使用 tweepy oauth 出现属性错误

python - 如果下拉列表为空而不显示,我如何从前端检查?

Django admin - 更改权限列表

django - 在 raw_id_fields 中一次插入更多记录