Django中的ManyToManyField及其附加信息

时间:2018-08-18 13:10:38

标签: django python-3.x django-models

我正在尝试弄清楚如何在Django中使用ManyToManyField添加其他信息。例如此代码:

class Animal(models.Model):
    # ...
    pass

class Log(models.Model):
    animal = models.ManyToManyField(Animal)

如果我想创建一个Log对象并为其选择Animal对象。然后,我想在我的Log中包含更多信息,例如头发的颜色,其中带有Animal对象的眼睛的颜色(我不能在Animal对象本身中添加它们)。 / p>

然后我想再次向 Log 对象添加另一个完全相同的对象。例如狐狸。所以我想为两个不同的狐狸两次添加Animal对象。特征相同,但唯一的改变是头发的颜色略有变化。如何做到这一点?

2 个答案:

答案 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)