Передать список OrderedDicts из validated_data в **kwargs
с помощью ModelSerializer
мне нужно было передать несколько родовых отношений, и это работает хорошо. Однако мне нужно воссоздать множество циклов for в методах update/create, чтобы они работали. Как я могу передать их как **kwargs в функции, поскольку результатом будет список OrederedDicts?
Например, у меня есть две модели:
models.py:
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 Tags(models.Model):
"""
Tags Model
"""
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) # < -------
serializer.py:
Как вы можете видеть выше, я иду против стандартов DRY, мне нужно создавать все заново для каждого поля, которое имеет отношение к переводу.
Я пытался передать их как kwargs, но безуспешно:
def translation_update_field(self, **kwargs):
model = self.Meta.model
content_type = ContentType.objects.get_for_model(model)
# gets total value from _data and loops its values.
arg_items_dicts = [i for i in kwargs]
for arg in kwargs:
arg_id = arg.get('id', None)
arg_field = arg.get('field', None)
if arg_id and arg_field == 'name':
arg_item = Translation.objects.get(id=arg_id, object_id=instance)
arg_item.lang = arg.get('lang', arg_item.lang)
...
def update(self, instance, validate_data):
names_data = validated_data.pop('name')
descriptions_data = validated_data.pop('description')
translation_update_field(self, names_data, descriptions_data):
# values passed as list of OrderedDicts not need to create the funcionality for each..
...
Ошибка:
TypeError: translation_update_field() takes 1 positional argument but 3 were given
Что я хотел бы применить, так это передать циклы for в функцию translation_update_field()
, чтобы иметь возможность передавать переводы другим классам и не добавлять массивный повторяющийся код в сериализаторы.