Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django保存这种关系的最佳方式是什么?_Python_Django_M2m - Fatal编程技术网

Python 在Django保存这种关系的最佳方式是什么?

Python 在Django保存这种关系的最佳方式是什么?,python,django,m2m,Python,Django,M2m,让我们想象一下,我们正在创建一个网站,在那里人们可以向其他人出售任何东西 例如,我们有两类:计算机和汽车 我们有一些类别的过滤器:内存、CPU、里程、颜色 我们有这些过滤器的值:4GB、8GB、AMD、Intel、0-9999、10000+、棕色、黑色(人们不能只键入自己的值,他们必须从列表中选择) Django代码示例: class Category(models.Model): parent = models.ForeignKey('self', null=True, blank=T

让我们想象一下,我们正在创建一个网站,在那里人们可以向其他人出售任何东西

例如,我们有两类:计算机和汽车

我们有一些类别的过滤器:内存、CPU、里程、颜色

我们有这些过滤器的值:4GB、8GB、AMD、Intel、0-9999、10000+、棕色、黑色(人们不能只键入自己的值,他们必须从列表中选择)

Django代码示例:

class Category(models.Model):
    parent = models.ForeignKey('self', null=True, blank=True)
    name = models.CharField(_('Name'), max_length=30)


class Filter(models.Model):
    categories = models.ManyToManyField(Category, db_index=True)
    name = models.CharField(_('Name'), max_length=30)


class FilterValue(models.Model):
    filter = models.ForeignKey(Filter, db_index=True)
    value = models.CharField(_('Filter value'), max_length=30)
因此,与类别相关的过滤器,与过滤器相关的过滤器值。现在我们有了我们的桌子:

类别:

id | name
------------------
 1 | Computers
 2 | Cars
过滤器:

id | name
------------------
 1 | CPU
 2 | Memory
 3 | Mileage
 4 | Color
类别过滤器:

id | category_id | filter_id
-----------------------------
 1 |           1 |         1
 2 |           1 |         2
 3 |           2 |         3
 4 |           2 |         4
筛选值:

id | filter_id | name
-----------------------------
 1 |         1 | Intel
 2 |         1 | AMD
 3 |         2 | 4GB
 4 |         2 | 8GB
 5 |         3 | 0-9999
 6 |         3 | 10000+
 7 |         4 | Brown
 8 |         4 | Black
现在问题来了-我应该如何制作项目模型? 示例代码:

class Item(models.Model):
    category = models.ForeignKey(Category, db_index=True)
    name = models.CharField(_('Name'), max_length=30)
    price = models.IntegerField(_('Price'))
但是如何将它与Django中的过滤器和过滤器值正确地链接呢?我可以创建两个多个关系,但它将创建3个数据库。但是,它只需要两个:

项目:

item-filter-filter_值:

id | item_id | filter_id | filter_value_id
------------------------------------------
 1 |       1 |         1 |               2
 2 |       1 |         2 |               3
 3 |       2 |         3 |               5
 4 |       2 |         4 |               8
所以现在在DB中有两项:我的电脑有AMD CPU和4GB内存,我的汽车有0-9999英里,黑色

哪种方法是实现此逻辑的正确方法?

您可以选择与建议的表相匹配的方法。在您的示例中,它可能如下所示:

class Item(models.Model):
    category = models.ForeignKey(Category, db_index=True)
    name = models.CharField(_('Name'), max_length=30)
    price = models.IntegerField(_('Price'))
    filters = models.ManyToManyField(Filter, through='ItemFilter')

class ItemFilter(models.Model):
    item = models.ForeignKey(Item)
    filter = models.ForeignKey(Filter)
    value = models.ForeignKey(FilterValue)

请注意有关如何通过模型字段访问以及如何更改相关管理器的文档。

是的,这就是我想要的。非常感谢。
class Item(models.Model):
    category = models.ForeignKey(Category, db_index=True)
    name = models.CharField(_('Name'), max_length=30)
    price = models.IntegerField(_('Price'))
    filters = models.ManyToManyField(Filter, through='ItemFilter')

class ItemFilter(models.Model):
    item = models.ForeignKey(Item)
    filter = models.ForeignKey(Filter)
    value = models.ForeignKey(FilterValue)