我正在尝试弄清楚如何在Django中使用ManyToManyField
添加其他信息。例如此代码:
class Animal(models.Model):
# ...
pass
class Log(models.Model):
animal = models.ManyToManyField(Animal)
如果我想创建一个Log
对象并为其选择Animal
对象。然后,我想在我的Log
中包含更多信息,例如头发的颜色,其中带有Animal
对象的眼睛的颜色(我不能在Animal
对象本身中添加它们)。 / p>
然后我想再次向 Log 对象添加另一个完全相同的对象。例如狐狸。所以我想为两个不同的狐狸两次添加Animal对象。特征相同,但唯一的改变是头发的颜色略有变化。如何做到这一点?
答案 0 :(得分:1)
如果要使用m2m字段,可以通过模型指定模型之间的模型,并且可以携带其他信息,例如此处(https://gist.github.com/jacobian/827937)。可以使用通过模型提供的信号来完成某些自定义功能。可以使用Log.animal.through。
进行访问。但是我认为您的设计不好。更好的办法是在Log上使用没有反向关系的外键,并添加信号以进行后保存,这将在创建Log的创建实例时向其添加信息,并将fk设置为创建的Animal实例。 https://docs.djangoproject.com/en/2.1/topics/signals/#listening-to-signals
答案 1 :(得分:1)
django默认情况下会创建第三个模型来处理manyTomany关系,您可以覆盖该模型并使用 through 将自定义字段添加到其中,就像doc所说的那样,如下面的代码所示:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __str__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)