В Django DRF я всегда получаю ValueError в моем методе обновления в моем сериализаторе - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Django DRF и успешно создал метод create в моем сериализаторе, но каким-то образом метод обновления не хочет работать так, как я хочу.Я всегда получаю ту же ошибку ValueError.

Моя модель:

class User(models.Model):
gender = models.CharField(max_length=10, choices=GENDER, default='Male')
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
position = models.CharField(max_length=50)
birthday = models.DateField(auto_created=False, null=True)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=15)
password = models.CharField(max_length=100, null=True)


class Company(models.Model):
company_name = models.CharField(max_length=50, blank=False)
address = models.CharField(max_length=50, blank=False)
zip = models.IntegerField(blank=False)
city = models.CharField(max_length=50, blank=False)
email = models.EmailField(max_length=50, blank=False)


class PartnerCompany(models.Model):
partner = models.ForeignKey(Company, on_delete=models.PROTECT)
contact_person = models.ForeignKey(User, on_delete=models.CASCADE)

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

class PartnerCompanySerializer(serializers.ModelSerializer):
partner = CompanySerializer(many=False)
contact_person = ClientUserSerializer(many=False)

class Meta:
    model = PartnerCompany
    fields = '__all__'

def create(self, validated_data):
    partner = validated_data.pop('partner')
    contact_person = validated_data.pop('contact_person')
    partner_instance = Company.objects.create(**partner)
    contact_person_instance = User.objects.create(**contact_person)
    return PartnerCompany.objects.create(partner=partner_instance,
                                         contact_person=contact_person_instance,
                                         **validated_data)


def update(self, instance, validated_data):
    instance.partner = validated_data.get('partner', instance.partner)
    instance.contact_person = validated_data.get('contact_person', instance.contact_person)
    partner_instance = Company.objects.update(**instance.partner)
    instance.save(partner_instance)
    return instance

Мой вид:

class PartnerCompanyUpdateByID(generics.RetrieveUpdateAPIView):
lookup_field = 'id'
queryset = PartnerCompany.objects.all()
serializer_class = PartnerCompanySerializer

Я всегда получаю эту ValueError:

ValueError в / partner / update / id / 6 Невозможно назначить "OrderedDict ([('company_name', 'UBS Switzerland'"), ('address', 'Mainstreet 1'), ('zip', 4102), ('city', 'Basel'), ('email', 'ubs@ubs.ch')]) ":" PartnerCompany.partner "должен быть экземпляром" Company ".

1 Ответ

0 голосов
/ 14 февраля 2019

Вы не должны отправлять partner_instance в качестве параметра в instance.save(). экземпляр уже имеет новые значения в partner .

def update(self, instance, validated_data):
    instance.partner = validated_data.get('partner', instance.partner)
    instance.contact_person = validated_data.get('contact_person', instance.contact_person)
    partner_instance = Company.objects.update(**instance.partner)
    instance.partner = partner_instance
    instance.save()
    return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...