集团在django加入了数据

时间:2017-04-13 04:48:16

标签: python django

鉴于以下模型:

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在一个查询中完成吗?

1 个答案:

答案 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)