【问题标题】:In Django DRF I always get the ValueError in my update method in my serializer在 Django DRF 中,我总是在序列化程序的更新方法中得到 ValueError
【发布时间】:2019-07-07 22:25:49
【问题描述】:

我正在使用 Django DRF,并且我已经在我的序列化程序中成功创建了 create 方法,但不知何故,update 方法不想按我的意愿工作。 我总是得到相同的 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:

/partner/update/id/6 处的 ValueError 无法分配“OrderedDict([('company_name', 'UBS Switzerland'), ('address', 'Mainstreet 1'), ('zip', 4102), ('city', 'Basel'), ('email' , 'ubs@ubs.ch')])": "PartnerCompany.partner" 必须是 "Company" 实例。

【问题讨论】:

    标签: python django django-models django-views django-serializer


    【解决方案1】:

    您不应将 partner_instance 作为参数发送到 instance.save()instance 已在 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
    

    【讨论】:

    • 我仍然得到相同的 ValueError,事实上我一直在尝试调试,因此它仍然作为 instance.save() 中的参数
    • 太棒了!不客气。非常感谢您选择我的答案
    • 此解决方案正在运行,但它正在数据库中创建新记录。但是,我只需要更新现有条目。是否有解决方法
    • 您是指PartnerCompany的新记录吗?
    • 确实,它在数据库中添加了PartnerCompany的全新记录。但是,由于某种原因,上面的代码适用于几次插入,现在相同的 ERR 显示“PartnerCompany.partner”必须是“Company”实例。”
    猜你喜欢
    • 2022-06-25
    • 2020-03-29
    • 2020-12-09
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多