在我的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']
它可以工作,但是我不知道这是否合法,并且对数据库进行了大量查询