Как написать ответ get для данных двух разных моделей в одном ответе, отсортированных по дате?
У меня есть две модели:
class A(models.Model):
...
date=models.DateTimeField(auto_add_now=True)
...
class B(models.Model):
...
date=models.DateTimeField(auto_add_now=True)
...
В обеих моделях есть поле даты. Теперь я хочу написать ответ get, чтобы я мог получить данные обеих этих моделей из базы данных, отсортированные по дате на фронтенде. Я написал сериализаторы моделей со всеми полями для них.
Теперь в ответе get я написал примерно следующее:
A = A.objects.all()
B = B.objects.all()
aSerializer = A_serializer(A, many=True)
bSerializer = B_serializer(B, many=True)
all = aSerializer.data + bSerializer.data
all = sorted(all, key=lambda item: item['date'],reverse=True)
return Response(all)
Я думаю, что не смогу сделать пагинацию и другие вещи с помощью этого. Пожалуйста, дайте мне знать, есть ли лучший подход для этого?
Попробуйте .union
.
ЗАМЕЧАНИЕ если A
и B
не имеют общих колонок, необходимо явно выделить общие поля.
# Fields to be serialized
shared_fields = ['date', ...]
AB = A.objects.all().values(*shared_fields)\
.union(B.objects.all().values(*shared_fields))\
.order_by('date')
# You probably need a new serialize
ab = UnionSerializer(AB, many=True)
return Response(ab.data)
необходимо использовать поле отношений один к одному между двумя моделями и затем определить сериализатор ссылка ниже
- введите код здесь
class BasicSerializer(serializers.ModelSerializer): class Meta: модель = MyModel поля = 'all'
class AdvandedSerializer(BasicSerializer): additional_field = serializers.SerializerMethodField()
def get_additional_field(self, obj):
return('not important')
class Meta(BasicSerializer.Meta):
fields = BasicSerializer.Meta.fields + ('additional_field',)`