Как написать ответ 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',)`
Вернуться на верх