如何从另一个模型更新字段的外键
How to update foreign key of field from another model
我正在尝试通过 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))
它工作正常但没有更新旧的,它创建新的
我只想更新公司模型中的旧模型
我找到了这个问题的解决方案,这就是我想要的:
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
并编辑 exist 公司名称的 FK OR 如果不存在则创建 new一个和PUT
新公司名称的FK
我正在尝试通过 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))
它工作正常但没有更新旧的,它创建新的 我只想更新公司模型中的旧模型
我找到了这个问题的解决方案,这就是我想要的:
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
并编辑 exist 公司名称的 FK OR 如果不存在则创建 new一个和PUT
新公司名称的FK