鉴于以下模型:
class ErrorPhrase(models.Model):
...
document = models.ForeignKey(to=Document, on_delete=models.CASCADE)
text = models.CharField(max_length=256)
start_index = models.PositiveIntegerField()
correct_form = models.CharField(max_length=256, blank=True)
class ErrorTag(models.Model):
...
error_phrase = models.ForeignKey(to=ErrorPhrase, on_delete=models.CASCADE)
error = models.CharField(max_length=1, choices=error_choices)
category = models.CharField(max_length=1, choices=category_choices)
type = models.CharField(max_length=2, choices=type_choices)
我想检索所有ErrorPhrase条目及其关联的ErrorTags。我使用了如下的值函数:
error_phrases = ErrorPhrase.objects.values(
"id", "text", "start_index", "errortag__error",
"errortag__category", "errortag__type")
但是这样我就可以获得特定ErrorPhrase对象的每个不同ErrorTag的一行数据。例如:
[{
"errortag__error": "S",
"errortag__type": "WO",
"errortag__category": "S",
"text": "test",
"id": 40,
"start_index": 463
},
{
"errortag__error": "T",
"errortag__type": "OO",
"errortag__category": "P",
"text": "test",
"id": 40,
"start_index": 463
}...]
我正在寻找一种通过ErrorPhrase字段对数据进行分组的方法(" id"," text"," start_index")并获得所有组中特定ErrorPhrase对象的ErrorTags。像这样:
[{
"text": "test",
"id": 40,
"start_index": 463,
"error_tags": [{
"errortag__error": "S",
"errortag__type": "WO",
"errortag__category": "S"},
{
"errortag__error": "T",
"errortag__type": "OO",
"errortag__category": "P"}]
},...]
我可以使用Django QuerySet API在一个查询中完成吗?
答案 0 :(得分:1)
您的 ErrorTag模型:
稍有变化class ErrorTag(models.Model):
...
error_phrase = models.ForeignKey(to=ErrorPhrase, on_delete=models.CASCADE,related_name='errortags')
error = models.CharField(max_length=1, choices=error_choices)
category = models.CharField(max_length=1, choices=category_choices)
type = models.CharField(max_length=2, choices=type_choices)
<强> serializers.py 强>
from rest_framework.serializers import SerializerMethodField
class ErrorPhraseListSerializer(ModelSerializer):
error_tags = SerializerMethodField('get_errors') #cannot use get_error_tags here
def get_errors(self,instance):
alist = []
tags_qs = instance.errortags.all()
for tag in tags_qs:
alist.append({
'errortag__error': tag.error,
'errortag__category':tag.category,
'errortag__type': tag.type
})
return alist
class Meta:
model = ErrorPhrase
fields = [
'document',
'text',
'start_index',
'correct_form ',
'error_tags',
]
现在位于 views.py
中class ErrorPhraseListAPIView(ListAPIView):
serializer_class = ErrorPhraseListSerializer
def get_queryset(self):
user = self.request.user
return File.objects.filter(user=user)