Skip to main content
 首页 » 编程设计

python之Django 多对多查询关系实体

2025年05月04日21soundcode

我有以下实体:

  1. 视频
  2. 标签
  3. 关系实体 - VideoTags

这是架构:

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() 

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

谢谢:)

请您参考如下方法:

在Django documentation说

If you need to access a membership's information you may do so by directly querying the Membership model:

它还说

Another way to access the same information is by querying the many-to-many reverse relationship from a Person object:

所以你必须有一些选择,比如:

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

或者也许

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