代码之家  ›  专栏  ›  技术社区  ›  Sektor

django模型:在响应中以列表的形式检索外键相关数据

  •  1
  • Sektor  · 技术社区  · 8 年前

    我必须建模:问题和标签,它们之间有“多对多”的关系。

     class Tag(models.Model):
        title = models.CharField(max_length=120)
    
        def __str__(self):
            return self.title
    
    
     class Question(models.Model):
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        tags = models.ManyToManyField(Tag, blank=True)
    
        title = models.CharField(max_length=120)
        text = models.TextField() 
        is_active = models.BooleanField(default=True)
        creation_date = models.DateTimeField(default=datetime.now)
    
        def __str__(self):
            return self.title
    
        class Meta:
            ordering = ['-creation_date']
    

    当我尝试时 为了获取带有相关标签的问题,我正在获取带有一个标签的问题的副本。

    我就是这么想的 检索问题 :

    list(Question.objects.all().filter(is_active__exact=True).values('id', 'title', 'tags'))
    

    我得到了这样的结果 :

    {'id': 3, 'tags': 1, 'title': 'question 3'}{'id': 3, 'tags': 2, 'title': 'question 3'}{'id': 2, 'tags': 2, 'title': 'question 2'}{'id': 2, 'tags': 3, 'title': 'question 2'}{'id': 1, 'tags': 1, 'title': 'question 1'}{'id': 1, 'tags': 2, 'title': 'question 1'}{'id': 1, 'tags': 3, 'title': 'question 1'}
    

    是否有办法获取问题,以便所有与之相关的标记都以单个列表的形式出现。 类似这样:

    {'id': 3, 'tags': [1, 2], 'title': 'question 3'}{'id': 2, 'tags': [2, 3], 'title': 'question 2'}{'id': 1, 'tags': [1, 2, 3], 'title': 'question 1'}
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   T.Tokic    8 年前

    问得好,我想你可以试试这样:

    questions = Question.objects.filter(is_active__exact=True).prefetch_related('tags')
    [{'id': question.id, 'title': question.title, 'tags': [tag.id for tag in question.tags.all()]} for question in questions]
    

    有关的更多信息 prefetch_related List Comprehension

    快乐编码;)