如何在 Django 中创建和 link 多对多表?
How can I create and link many-to-many tables in Django?
我正在 Django 应用程序中实现以下模式,但我是 Django 的 ORM 新手:
简而言之,一个 DayMenu 列出了多个 MenuItem。 (MenuItem 只是 DayMenu 和 Meal 之间的多对多关系。)每个用户从 DayMenu 中选择一个 MenuItem。 (此选择表示为 UserItemChoice。)
在我们的初稿models.py
(下)中,MenuItem 被定义为 DayMenu 模型中的多对多字段。
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Meal(models.Model):
# field options: diet
MEAT = "MEAT"
VEGETARIAN = "VEGET"
HALAAL = "HALAA"
DIET_CHOICES = (
(MEAT, "Meat"),
(VEGETARIAN, "Vegetarian"),
(HALAAL, "Halaal"),
)
# field options: type
FREE = "FREE"
PAID = "PAID"
SKIP = "SKIP"
TYPE_CHOICES = (
(FREE, "Free"),
(PAID, "Paid"),
(SKIP, "Skip"),
)
# fields
cost = models.IntegerField(default=10)
description = models.CharField(max_length=120)
diet = models.CharField(max_length=5, choices=DIET_CHOICES)
type = models.CharField(max_length=5, choices=TYPE_CHOICES)
class DayMenu(models.Model):
# fields
date = models.DateField()
locked = models.BooleanField(default=False)
item = models.ManyToManyField(Meal) # TODO: confirm (replaces MenuItem in schema)
# class UserItemChoice(models.Model):
#
# # fields
# user = models.CharField() # FIXME
# menuitem = models.CharField() # FIXME
# selected = models.BooleanField(default=False)
# like = models.NullBooleanField(default=None)
鉴于以下情况,我们如何定义 UserItemChoice:
- 本身就是多对多关系
- 它链接到多对多字段而不是(显式)模型
- 它将(理想情况下?)成为内置用户的多对多字段 table
我想你想要的是将 UserItemChoice
定义为 User
和 MenuItem
之间的 m2m 关系的 through
模型。 through
模型主要用于m2m关系之间定义一些额外的属性。
这里一个用户可以有多个 MenuItem
s,但您还希望关系附带 selected
和 like
等属性,但将这 2 个属性移动到任一模型不好,因此 through
是最好的解决方案。
查看有关 through
definition and example 的 django 文档。
我正在 Django 应用程序中实现以下模式,但我是 Django 的 ORM 新手:
简而言之,一个 DayMenu 列出了多个 MenuItem。 (MenuItem 只是 DayMenu 和 Meal 之间的多对多关系。)每个用户从 DayMenu 中选择一个 MenuItem。 (此选择表示为 UserItemChoice。)
在我们的初稿models.py
(下)中,MenuItem 被定义为 DayMenu 模型中的多对多字段。
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Meal(models.Model):
# field options: diet
MEAT = "MEAT"
VEGETARIAN = "VEGET"
HALAAL = "HALAA"
DIET_CHOICES = (
(MEAT, "Meat"),
(VEGETARIAN, "Vegetarian"),
(HALAAL, "Halaal"),
)
# field options: type
FREE = "FREE"
PAID = "PAID"
SKIP = "SKIP"
TYPE_CHOICES = (
(FREE, "Free"),
(PAID, "Paid"),
(SKIP, "Skip"),
)
# fields
cost = models.IntegerField(default=10)
description = models.CharField(max_length=120)
diet = models.CharField(max_length=5, choices=DIET_CHOICES)
type = models.CharField(max_length=5, choices=TYPE_CHOICES)
class DayMenu(models.Model):
# fields
date = models.DateField()
locked = models.BooleanField(default=False)
item = models.ManyToManyField(Meal) # TODO: confirm (replaces MenuItem in schema)
# class UserItemChoice(models.Model):
#
# # fields
# user = models.CharField() # FIXME
# menuitem = models.CharField() # FIXME
# selected = models.BooleanField(default=False)
# like = models.NullBooleanField(default=None)
鉴于以下情况,我们如何定义 UserItemChoice:
- 本身就是多对多关系
- 它链接到多对多字段而不是(显式)模型
- 它将(理想情况下?)成为内置用户的多对多字段 table
我想你想要的是将 UserItemChoice
定义为 User
和 MenuItem
之间的 m2m 关系的 through
模型。 through
模型主要用于m2m关系之间定义一些额外的属性。
这里一个用户可以有多个 MenuItem
s,但您还希望关系附带 selected
和 like
等属性,但将这 2 个属性移动到任一模型不好,因此 through
是最好的解决方案。
查看有关 through
definition and example 的 django 文档。