Передать список 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(), чтобы иметь возможность передавать переводы другим классам и не добавлять массивный повторяющийся код в сериализаторы.

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