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
к этому объединенному набору запросов?