Фильтр нескольких общих связанных полей из одной модели в djang rest framework

У меня есть две модели, которые коррелируют друг с другом с помощью GenericRelation().

class Translation(models.Model):
    """
    Model that stores all translations
    """
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
    object_id = models.CharField(max_length=50, null=True, blank=True)
    content_object = GenericForeignKey()
    lang = models.CharField(max_length=5, db_index=True)
    field = models.CharField(max_length=255, db_index=True, null=True)
    translation = models.TextField(blank=True, null=True)

    class Meta:
        ordering = ['lang', 'field']
        unique_together = (('content_type', 'object_id', 'lang', 'field'),)

class Tags(models.Model, Translatable):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    DISEASE = 0
    TYPE = [(DISEASE, 'disease')]
    type = models.PositiveSmallIntegerField(choices=TYPE)


    name = GenericRelation(Translation)
    description = GenericRelation(Translation)

Я пытаюсь создать и отфильтровать два поля, которые имеют общую связь с моделью Translation.

class TranslationSerializer(serializers.ModelSerializer):
    """ 
    Translation serializer to be nested into other
    serializers that needs to display their translation.
    """
    class Meta:
        model = Translation

        fields = "__all__"


class TagsSerializer(WritableNestedModelSerializer):


    name = TranslationSerializer(required=False, many=True)
    description = TranslationSerializer(required=False, many=True)


    class Meta:
        model = Tags
        fields = ['id', 'type', 'name','description']


    def create(self, validate_data):
        """
        Create nested translation.
        content_type and object_id are added dynamically.
        """
        names = validate_data.pop('name')
        description = validate_data.pop('description')

        tags = Tags.objects.create(**validate_data)

        for n in names:
            model = self.Meta.model
            content_type = ContentType.objects.get_for_model(model)
            n['content_type'] = content_type.id
            n['object_id'] = tags
            tags.name.create(**n)
        

        for desc in description:
            model = self.Meta.model
            content_type = ContentType.objects.get_for_model(model)
            desc['content_type'] = content_type.id
            n['object_id'] = tags
            tags.description.create(**desc)
      
        return tags

То, как я передаю значения, создает две полезные нагрузки для каждого поля, что понятно, так как они взяты из одной модели:

 {
        "id": "4619d025-e580-48c6-82ec-40cfd3433eb0",
        "type": 0,
        "name": [
            {
                "id": 5,
                "lang": "pt",
                "translation": "descrição qualquer",
                "field": "description"
            },
            {
                "id": 4,
                "lang": "pt",
                "translation": "ola",
                "field": "name"
            }
        ],
        "description": [
            {
                "id": 5,
                "lang": "pt",
                "translation": "descrição qualquer",
                "field": "description"
            },
            {
                "id": 4,
                "lang": "pt",
                "translation": "ola",
                "field": "name"
            }
        ]
    },

Для фильтрации значений (чтобы поместить их как имя в имя и описание в описание) я использовал SerializerMethod(), get_name() и get_description(), которые прекрасно работают, получая данные, которые уже есть в базе данных. Однако я не могу написать новые вложенные переводы, используя этот метод.

данные отфильтрованы:

{
        "id": "4619d025-e580-48c6-82ec-40cfd3433eb0",
        "type": 0,
        "name": [
            {
                "id": 5,
                "lang": "pt",
                "translation": "descrição qualquer",
                "field": "description"
            }
        ],
        "description": [
            {
                "id": 5,
                "lang": "pt",
                "translation": "descrição qualquer",
                "field": "description"
            }
        ]
    }
Вернуться на верх