#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
fromGroup
model не будет ее первичным ключом, просто какой-то пользовательский столбец CharField. Не могли бы вы поделиться некоторыми записями из вашей базы данных? Вы обновляете их через стандартную форму django, верно?2. @MarekPiotrowski не использует форму, только как API. Я знаю, что это не первичный ключ, но по этому полю я хочу отфильтровать, невозможно ли обновить без первичного ключа?