Django 如何在不改变记录对象的情况下创建多对多链接

Django 如何在不改变记录对象的情况下创建多对多链接,django,django-models,Django,Django Models,我觉得我错过了一些基本的东西,但我无法理解。我将给出一个简单的例子,说明我正在努力实现的目标。以这家典型的餐馆为例 如果我有一张比萨饼表,上面有比萨饼名称的记录。另一张桌子是比萨配料。他们有一种多对多的关系。如果客户订购带有“意大利香肠”和“蘑菇”的“2 Topping”,那么在后端,一些脚本将获取“2 Topping”比萨饼对象,获取两个Topping对象,然后链接/添加/关联它们。因此,pizza.toppings.all()将返回两个topping的查询集 如果一位不同的顾客在不久后订购了

我觉得我错过了一些基本的东西,但我无法理解。我将给出一个简单的例子,说明我正在努力实现的目标。以这家典型的餐馆为例

如果我有一张比萨饼表,上面有比萨饼名称的记录。另一张桌子是比萨配料。他们有一种多对多的关系。如果客户订购带有“意大利香肠”和“蘑菇”的“2 Topping”,那么在后端,一些脚本将获取“2 Topping”比萨饼对象,获取两个Topping对象,然后链接/添加/关联它们。因此,
pizza.toppings.all()
将返回两个topping的查询集

如果一位不同的顾客在不久后订购了完全相同的比萨饼。先前添加的浇头将已链接到该比萨饼对象。显然,在每一个订单完成后都要理清关系是不现实的


##模型
等级比萨饼(型号.型号):
name=models.CharField(最大长度=30)
toppings=models.ManyToManyField('Topping',related_name='pizzas'))
定义(自我):
返回self.name
班级排名(models.Model):
name=models.CharField(最大长度=30)
定义(自我):
返回self.name
类顺序(models.Model):
pizza=models.ForeignKey(pizza,on_delete=models.CASCADE)
##逻辑
cheese\u pizza=pizza.objects.create(name='cheese')
mozzarella=Topping.objects.create(name='mozzarella')
马苏里拉,比萨,加(奶酪比萨)
莫扎里拉、披萨、所有()->
如何在不影响pizza表中的原始pizza对象的情况下,将链接了浇头的pizza对象添加到Orders表中,以便
pizza.objects.get(name=“2 Topping”)
始终返回未链接浇头对象的对象

一位顾客点了一份“2顶”加“意大利香肠”和“蘑菇”

通常的建模方法是将配料作为订单的一部分
Pizza
Topping
是事物的类型,而
订单
记录每个订单上所做的特定选择

class Pizza(models.Model):
    name = models.CharField(max_length=30)

class Topping(models.Model):
    name = models.CharField(max_length=30)

class Order(models.Model):
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE, related_name='orders')
    toppings = models.ManyToManyField('Topping', related_name='orders')

如果某些比萨饼的配料已经烤好了(可以这么说),那么您可以将配料作为
比萨饼
订单
的一部分,可能还需要一些额外的信息来指示允许的配料数量,以供验证。由于这显然不是您真正的代码,因此很难说建模问题的最佳方法是什么。

这与我得出的结论类似。很高兴得到证实。事实上,真正的问题比这更复杂,然而,这是我试图了解的主要概念。非常感谢你的帮助。