django rest框架中的汇总结果

时间:2020-09-29 09:35:23

标签: django postgresql django-rest-framework

在我的posgresql中,我有一个模型“ words”:

class Words(models.Model):
    word = models.CharField(db_index=True, max_length=50)
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
    time_stamp = models.TimeField(auto_now=False, auto_now_add=False)

在我看来,查询后,我会搜索表示查询本身的单词 很多单词重复了,我需要将它们汇总到结果中 我的目标是使用一个json文件进行响应,该json文件收集各个单词并列出其时间戳 像这样:

[
    {
        "word": "foo",
        "list": 
          [
            {
              "id": 10416,
              "lesson": 11,
              "time_stamp": "00:02:49.100000"
            },
            {
              "id": 10702,
              "lesson": 12,
              "time_stamp": "00:27:31.300000"
            },
            ...
          ]
    },
    {
        "word": "too",
        "list": 
          [
            {
              "id": 10416,
              "lesson": 11,
              "time_stamp": "00:02:49.100000"
            },
            {
              "id": 10702,
              "lesson": 12,
              "time_stamp": "00:27:31.300000"
            },
            ...
          ]
    },
]

我找到了两个解决方案,但都有缺点

1-像这样重做数据库:

class WordsName(models.Model):
    word = models.CharField(unique=True, db_index=True, max_length=50)

class WordsDetail(models.Model):
    wordName = models.ForeignKey(WordsName, on_delete=models.CASCADE)
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
    time_stamp = models.TimeField(auto_now=False, auto_now_add=False)

但这是一个很大的改变

2-制作另一个序列化器:

class WordListSerializer(serializers.ModelSerializer):
    word = serializers.SerializerMethodField('get_word')
    list = serializers.SerializerMethodField('list_word')

    class Meta:
        model = Words
        fields = ['word', 'list']

    def get_word(self, obj):
        return obj.word + '*'

    def list_word(self, obj):
        word = Words.objects.filter(word=obj.word)
        return BinomiSerializer(word, many=True).data


class WordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Words
        fields = ['id', 'lesson', 'time_stamp']

它可以工作,但是我不知道这是否合法,并且对数据库进行了大量查询

0 个答案:

没有答案