Сериализатор DRF не выдает ошибку при обновлении, но не обновляет

#python #django #django-rest-framework #foreign-keys #django-serializer

#python #django #django-rest-framework #внешние ключи #django-serializer

Вопрос:

У меня есть модель с внешним ключом, которую я пытаюсь обновить через сериализатор, я не хочу использовать встроенное поле ID для поиска внешнего ключа. Похоже, что мой код сериализатора работает нормально, ошибка не возникает, но он не обновляет поле внешнего ключа.

Модели:

 
class Group(models.Model):
    group_id = models.CharField(max_length=100)
    name = models.CharField(max_length=255)
    farm = models.ForeignKey(to=Farm, on_delete=models.CASCADE, related_name=RelatedNames.GROUPS,
                             default=None, null=True, blank=True, )

    milking = models.BooleanField(help_text=GroupHelpTexts.MILKING)
    sub_groups = models.ForeignKey('self', on_delete=models.PROTECT, related_name=RelatedNames.SUBGROUPS,
                                   null=True, blank=True, )


    def __str__(self):
        return f'{self.name}'


class Cow(models.Model):
    management_id = models.CharField(max_length=255)
    eid_number = models.CharField(max_length=255, primary_key=True, blank=False, )

    group = models.ForeignKey(Group, on_delete=models.PROTECT,
                              default=None, null=True, blank=True, related_name=RelatedNames.COWS)
  

Мой сериализатор:

 class CowManagementSerializer(serializers.ModelSerializer):
    group = serializers.SlugRelatedField(slug_field='group_id', queryset=Group.objects.all())

    class Meta:
        model = Cow
        fields = ['management_id', 'eid_number', 'group']

    def validate(self, attrs):
        if attrs['group']:
            try:
                name = attrs['group']
                user = self.context['request'].user
                group = Group.objects.get(name=name, farm__user=user)
                attrs['group'] == group
                return attrs
            except Group.DoesNotExist:
                raise serializers.ValidationError("Group Not Found")
        return attrs

    def update(self, instance, validated_data):
        group = validated_data.pop('group')
        instance.group = group
        instance.save()
        return instance
  

Если я удаляю поле, связанное с задержкой, я получаю эту ошибку:

 {
  "group": [
    "Incorrect type. Expected pk value, received str."
  ]
}
  

с его помощью я получаю код состояния 200, но обновление не выполняется.

Комментарии:

1. Не уверен насчет конфигурации вашей базы данных, но group_id from Group model не будет ее первичным ключом, просто какой-то пользовательский столбец CharField. Не могли бы вы поделиться некоторыми записями из вашей базы данных? Вы обновляете их через стандартную форму django, верно?

2. @MarekPiotrowski не использует форму, только как API. Я знаю, что это не первичный ключ, но по этому полю я хочу отфильтровать, невозможно ли обновить без первичного ключа?