django 模型:检索外键相关数据作为响应中的列表
django models: retrieve foreign key related data as a list inside a response
我必须建模:问题和标签,它们之间有 "many to many" 关系。
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'}
问得好,我想你可以试试这样的问题:
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 and List Comprehension 的更多信息。
编码愉快 ;)
我必须建模:问题和标签,它们之间有 "many to many" 关系。
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'}
问得好,我想你可以试试这样的问题:
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 and List Comprehension 的更多信息。
编码愉快 ;)