Django与其他字段的ManyToMany关系


72

我想在其中自动创建的ManyToMany联接表中存储一些其他信息。我将如何在Django中做到这一点?

就我而言,我有两个表:“雇员”和“项目”。我要存储的是每个项目中每个员工每小时工作所获得的收入,因为这些价值并不相同。那么,我该怎么做呢?

我想到的是,而不是方法“ ManyToManyField”,显式创建一个第三类/表来存储这些新信息,并使用“ ForeignKey”方法设置其与“ Employees”和“ Projects”的关系。我很确定它会起作用,但这是最好的方法吗?



@ravz为什么不应该将它作为该对象的伪造而关闭?
TylerH,2015年

@TylerH这是旧文章。但是,两个问题都有答案,我建议将它们合并。
ravi404

Answers:


108

这是您要实现的示例:

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

万一链接中断:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

1
如何访问模板中的date_joined?Group.date_joined不起作用。
2014年

加入群组日期无效,因为群组本身未加入任何内容。相反,您可以获取它的成员并获取他们的加入时间。for group.members.all()中的成员:
gruszczy 2014年

2
如何通过上述方法使用group.members.add()?
Dejell

@Dejell提到的链接中的代码示例可能会对您有所帮助。
Devesh Khandelwal'4

2
您可以使用<model> _set访问胶粘模型对象。因此,例如group.membership_set.all()。请注意,您始终将整个模型名称都小写以查找此属性,然后添加_set。
Sensei
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.