在Django中指定同一字段上的多个“直通”表

时间:2013-03-15 16:27:40

标签: django django-models

我正在创建一个带有两个指向同一字段的ManyToManyField的Django模型。

在我的例子中,人才和兴趣都是“技能”,但有不同的通过表。

class Skills(models.Model):

    def __unicode__(self):
        return self.name

    name = models.CharField(max_length=255, unique=True)
    users = models.ManyToManyField(UserProfile, default=None,
            through='TalentDetails', related_name='talents')
    users = models.ManyToManyField(UserProfile, default=None,
            through='InterestDetails', related_name='interests')

我在尝试通过相关名称访问人才时遇到错误

UserProfile.interests.all()    #[<Skills: Guitar>]
UserProfile.talents.all() # AttributeError: 'UserProfile' object has no attribute 'talents'
# the following works
UserProfile.talentdetails_set.all() # [<TalentDetails: (u'Architecture',)>]

所以有几个问题:

  • 为什么第二个查询失败?
  • 这是一种在同一字段上指定多个“通过”表的犹太方式,还是有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

你有两个名称相同的模型字段users,第二个(到InterestDetails)正在替换第一个,只是给它们不同的名称,它会起作用。

答案 1 :(得分:-1)

你所问的真的没有意义。显然,一个字段只能有一组选项,而你试图有两组。但目前尚不清楚为什么要这样做:我明白这两个领域都是连接相同的两个表,但是他们正在对不同的东西进行建模:第一个领域是“拥有此技能作为天赋的用户”,另一个领域是'将此技能作为兴趣的用户'。因此,您应该有两个字段,都指向UserProfile但名称不同 - 例如users_with_talentusers_with_interest

(请注意,除非您定义有关关系的额外信息,否则无需明确定义直通表。)