我正在尝试通过serializer.py更新另一个模型中的字段,但我收到此错误:
duplicate key value violates unique constraint "sales_company_company_name_8f098bd8_uniq"
DETAIL: Key (company_name)=(fdsfasf) already exists.
serializer.py代码: 公司模型是客户模型中的FK
class CompanySerializer(serializers.ModelSerializer):
model = models.Company
fields = ('company_name',)
class CustomersIsCompanySerializer(serializers.ModelSerializer):
company = CompanySerializer
company_name = serializers.CharField(max_length=255)
def update(self, instance, validated_data):
instance.company_name = models.Company.objects.update(company_name=validated_data.get('company_name', instance.company_name))
instance.phone = validated_data.get('phone', instance.phone)
instance.mobile = validated_data.get('mobile', instance.mobile)
instance.email = validated_data.get('email', instance.email)
instance.website = validated_data.get('website', instance.website)
instance.save()
return instance
class Meta:
model = models.Customers
fields = (
'id',
'company_name',
'phone',
'mobile',
'email',
'website',
)
extra_kwargs = {
'phone': {'validators': []},
'mobile': {'validators': []},
'email': {'validators': []},
'website': {'validators': []},
}
和我的观看代码:
class CustomerIsCompanyGetIdPutPatchView(generics.RetrieveAPIView,
mixins.UpdateModelMixin):
permission_classes = (AllowAny,)
queryset = models.Customers.objects.all()
serializer_class = CustomersIsCompanySerializer
def get_object(self):
id = self.kwargs['id']
obj = generics.get_object_or_404(User, id=id)
return obj
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
但如果我替换update
而create
它可以正常工作,但它会在数据库中创建一个新行而不更新旧行。
例如,如果我替换该代码:
instance.company_name = models.Company.objects.update(company_name=validated_data.get('company_name', instance.company_name))
通过此代码:
instance.company_name = models.Company.objects.create(company_name=validated_data.get('company_name', instance.company_name))
它工作正常,但没有更新旧,它创建新的 只是我想在公司模型中更新旧的
答案 0 :(得分:0)
我找到了解决这个问题的方法,这就是我想要的:
instance.company_name, created = models.Company.objects.get_or_create(company_name=validated_data.get('company_name', instance.company_name))
我在这里使用 created
和 get_or_create
查看它是否存在,然后直接PUT
并编辑FK 存在 公司名称或如果不存在,请创建 新 一个和{{ 1}}新公司名称的FK