Django ManyToMany отношения на объединенном наборе запросов из разных моделей

Я не могу присоединить записи отношения ManyToMany с помощью сериализатора к объединенному набору запросов из разных модальностей БД.

У меня есть две похожие модели БД, A и B, обе с отношениями ManyToMany с другой моделью, Tag.

from django.db import models


class Tag(models.Model):
    name = models.CharField(max_length=100)


class A(models.Model):
    name = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)


class B(models.Model):
    name = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)

Я хочу объединить A и B, и соединить данные из Tag через сериализатор. Вот мой сериализатор:

from rest_framework import serializers

from union.models import A, B, Tag


class TagSerializer(serializers.ModelSerializer):

    class Meta:
        model = Tag
        fields = '__all__'


class ABUnionSerializer(serializers.Serializer):
    name = serializers.CharField()
    tags = TagSerializer(many=True)

Когда я создаю набор queryset, объединяющий A и B, а затем передаю его в ABUnionSerializer, сериализатор не присоединяет данные Tag из B корректно. Пример:

from django.test import TestCase
from union.models import A, B, Tag
from union.serializers import ABUnionSerializer


class UnionTestCase(TestCase):

    def test_union(self):
        ta = Tag.objects.create(name='t-a')
        tb = Tag.objects.create(name='t-b')
        a = A.objects.create(name='aaa')
        a.tags.add(ta)
        b = B.objects.create(name='bbb')
        b.tags.add(tb)

        u = A.objects.all().union(B.objects.all())
        s = ABUnionSerializer(u, many=True)
        print(s.data)

Сериализатор пытается использовать таблицу отношений из A вместо B. В данном примере это приводит к тому, что сериализованная запись "bbb" имеет тег "t-a" вместо "t-b". Вероятно, это связано с документированным поведением объединенных кверисетов:

union(), intersection() и difference() возвращают экземпляры модели типа первого QuerySet, даже если аргументами являются {{QuerySet}} других моделей.

Какой лучший способ присоединиться Tags к этому объединенному набору запросов?

Вернуться на верх