Фильтр нескольких общих связанных полей из одной модели в 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"
}
]
}