Django多对多查询关系实体

时间:2012-12-03 11:10:16

标签: python django many-to-many querying

我有以下实体:

  1. 标签
  2. 关系实体 - VideoTags
  3. 这是架构:

    class Tag(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100, unique=True)
        class Meta:
            db_table = u'tags'
    
    class Video(models.Model):
        guid = models.CharField(max_length=36, primary_key=True)
        title = models.CharField(max_length=600)
        tags = models.ManyToManyField(Tag, through='VideoTag')
        class Meta:
            db_table = u'videos'
    
    class VideoTag(models.Model):
        guid = models.CharField(max_length=36, primary_key=True)
        tag = models.ForeignKey(Tag)
        video = models.ForeignKey(Video)
        weight = models.FloatField()
        class Meta:
            db_table = u'video_tags'
    

    现在,这一切在创建实体时都很有效。现在说我想通过它的Id来提取视频并迭代它的标签。

    当我这样做时:

    video = Video.objects.get(pk=1)
    tags = video.tags.all()
    

    我实际上得到了Tag实体列表,因为它们与视频有关,而与关系实体VideoTag无关。我想访问视频的标签,更重要的是访问关系表上的额外字段之一 - 重量。我不能这样做,因为视频上的标签属性是Tag。

    谢谢:)

1 个答案:

答案 0 :(得分:0)

Django documentation中说

  

如果您需要访问会员资格,可以直接查询会员资格模式:

它也说

  

访问相同信息的另一种方法是从Person对象查询多对多反向关系:

所以你必须选择,例如:

VideoTag.objects.filter(video=video).order_by('weight')

或者

Tag.videotag_set.all().order_by('weight')