如何从另一个模型更新字段的外键

时间:2018-04-11 21:17:15

标签: django django-models django-rest-framework django-views django-serializer

我正在尝试通过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)

但如果我替换updatecreate它可以正常工作,但它会在数据库中创建一个新行而不更新旧行。 例如,如果我替换该代码:

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))

它工作正常,但没有更新旧,它创建新的 只是我想在公司模型中更新旧的

1 个答案:

答案 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