指定多个";透过「;Django中同一字段上的表

指定多个";透过「;Django中同一字段上的表,django,django-models,Django,Django Models,我正在创建一个Django模型,其中有两个指向同一个字段的多个字段 在我的例子中,天赋和兴趣都是“技能”,但有一个不同的贯穿表 class Skills(models.Model): def __unicode__(self): return self.name name = models.CharField(max_length=255, unique=True) users = models.ManyToManyField(UserProfile,

我正在创建一个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',)>]
UserProfile.interests.all()#[]
UserProfile.talients.all()#AttributeError:'UserProfile'对象没有属性'talients'
#以下作品
UserProfile.talentdetails_set.all()#[]
有几个问题:

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

您有两个同名的模型字段,
用户
,第二个(有趣的细节)正在替换第一个,只需给他们不同的名称,就可以了。

您所问的真的没有意义。显然,一个字段只能有一组选项,而您正试图拥有两组选项。但不清楚您为什么要这样做:我知道这两个字段都链接了相同的两个表,但它们对不同的事情进行了建模:第一个字段是“作为人才拥有此技能的用户”,另一个字段是“作为兴趣拥有此技能的用户”。因此,您应该有两个字段,都指向UserProfile,但名称不同-例如
users\u和
users\u和
users\u


(请注意,除非您正在定义有关关系的额外信息,否则不需要显式定义through表。)

true。但是,我希望避免使用两个字段(例如user和user_u)来指定相同的关系(user)。如果我指定关系不是对称的,我可以让技能字段在与UserProfile的关系中使用两个不同的“直通”表吗?我认为我们需要更好地理解您试图在这里建模的整体问题,感觉您可能试图以错误的方式解决它。这很可能是。我正在建立一个人才/兴趣目录。天赋和兴趣都代表了一种从技能到侧面的关系。此关系的详细信息可在[Talent | Skill]详细信息表中找到。现在,我正在尝试创建两个从Skill到Profile的“through”表来模拟这种关系。我想我可以只使用一个带有旗帜的“直通”表来判断它是否是天赋/技能,但这不是一个非常优雅的解决方案……我同意旗帜不是非常优雅的观点,但我认为在这种情况下它是有意义的。它简化了数据模型,也有助于数据库查询。