如何在 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:

我想你想要的是将 UserItemChoice 定义为 UserMenuItem 之间的 m2m 关系的 through 模型。 through 模型主要用于m2m关系之间定义一些额外的属性。

这里一个用户可以有多个 MenuItems,但您还希望关系附带 selectedlike 等属性,但将这 2 个属性移动到任一模型不好,因此 through 是最好的解决方案。

查看有关 through definition and example 的 django 文档。