首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:不能分配"1":"LeadFacilityAssign.assigned_facilities“必须是”设施“实例

ValueError:不能分配"1":"LeadFacilityAssign.assigned_facilities“必须是”设施“实例
EN

Stack Overflow用户
提问于 2022-10-31 13:25:57
回答 2查看 50关注 0票数 1

我一直试图创建一个api端点来更新我的“铅”对象,并在发送put请求时向它们添加一个工具列表(每次都有不同数量的工具)。铅对象已经存在于数据库中,设施对象也是如此。由于我需要一个日期和时间与每个工具相关联,当它们被添加到一个领导时,我创建了"LeadFacilityAssign“类。由于我无法让它开始工作,所以我现在只想通过post请求来完成它,在领导创建过程中。有人告诉我,如果我需要以这种方式添加多个工具,我需要使用bulk_create。我在drf文档中找不到任何关于bulk_create的东西,所以我决定现在只使用一个工具来完成这个任务,并且每次只改进我的代码,因为我对drf很陌生。

有人知道是什么导致了这个错误吗?我尝试了几种不同的方法,但到目前为止都没有用。

代码语言:javascript
复制
ValueError: Cannot assign "1": "LeadFacilityAssign.assigned_facilities" must be a "Facility" instance.

serializers.py

代码语言:javascript
复制
class LeadUpdateSerializer(serializers.ModelSerializer):
    is_owner = serializers.SerializerMethodField()
    assigned_facilities = serializers.IntegerField(required=True)
    datetime = serializers.DateTimeField(required=True)

    class Meta:
        model = Lead
        fields = (
            "id",
            "first_name",
            "last_name",
            "assigned_facilities",
            "datetime",
        )
        read_only_fields = ("id", "created_at", "agent", "is_owner")

    def get_is_owner(self, obj):
        user = self.context["request"].user
        return obj.agent == user
    
    def create(self, validated_data):
        assigned_facilities = validated_data.pop("assigned_facilities")
        datetime = validated_data.pop("datetime")
        instance = Lead.objects.create(**validated_data)
        instance.leadfacility.create(assigned_facilities=assigned_facilities,datetime=datetime)
        print(instance)
        return instance

models.py

代码语言:javascript
复制
class Facility(models.Model):
    name = models.CharField(max_length=150, null=True, blank=False)

    def __str__(self):
        return self.name

class Lead(models.Model):
    first_name = models.CharField(max_length=40, null=True, blank=True)
    last_name = models.CharField(max_length=40, null=True, blank=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

class LeadFacilityAssign(models.Model):
    assigned_facilities = models.ForeignKey(Facility, on_delete=models.CASCADE, related_name='leadfacility')
    lead = models.ForeignKey(Lead, on_delete=models.CASCADE, related_name='leadfacility')
    datetime = models.DateTimeField()

views.py

代码语言:javascript
复制
class LeadCreateView(CreateAPIView):
    permission_classes = [IsAuthenticated, IsLeadOwner]
    serializer_class = LeadUpdateSerializer

    def perform_create(self, serializer):
        serializer.save(agent=self.request.user)

class LeadUpdateView(UpdateAPIView):
    permission_classes = [IsAuthenticated, IsLeadOwner]
    serializer_class = LeadUpdateSerializer

    def get_queryset(self):
        return Lead.objects.all()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-31 15:08:54

您正在尝试将Integer值添加到FK field中。

你有两个选择。您可以更改序列化程序字段。

代码语言:javascript
复制
assigned_facilities = serializers.PrimaryKeyRelatedField(queryset=Facility.objects.all(), required=True, write_only=True)

代码语言:javascript
复制
    assigned_facilities = serializers.IntegerField(required=True, write_only=True)
instance.leadfacility.create(assigned_facilities_id=assigned_facilities,datetime=datetime)

我宁愿使用1种选择。

票数 2
EN

Stack Overflow用户

发布于 2022-11-04 06:15:48

另一种可能的解决方案是:

代码语言:javascript
复制
class LeadUpdateSerializer(serializers.ModelSerializer):
    is_owner = serializers.SerializerMethodField()
    assigned_facilities = serializers.IntegerField(required=True)
    datetime = serializers.DateTimeField(required=True)

    class Meta:
        model = Lead
        fields = (
            "id",
            "first_name",
            "last_name",
            "assigned_facilities",
            "datetime",
        )
        read_only_fields = ("id", "created_at", "agent", "is_owner")
   
    def validate_assigned_facility(self, facility_pk)->:
        assigned_facility = Facility.objects.filter(pk=facility_pk).first()
        if assigned_facility:
            return assigned_facility
        raise ValidationError('Facility not found, provide a valid pk')

    def get_is_owner(self, obj):
        user = self.context["request"].user
        return obj.agent == user
    
    def create(self, validated_data):
        assigned_facilities = validated_data.pop("assigned_facilities")
        datetime = validated_data.pop("datetime")
        instance = Lead.objects.create(**validated_data)
        instance.leadfacility.create(assigned_facilities=assigned_facilities,datetime=datetime)
        print(instance)
        return instance

这个解决方案很大,但非常灵活,因为您可以在模型或数据源中的输入和预期数据周围添加更多业务逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74263972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档