【问题标题】:Fill Many to Many field through API通过 API 填写多对多字段
【发布时间】:2020-12-10 10:28:25
【问题描述】:

我正在尝试实现一个 API 来添加 Agent。代理具有多对多字段、角色

我正在使用 Django 和 Django Rest Framework。

这是模型:

class Role(models.Model):
    code = models.CharField(max_length=50, primary_key=True)
    labe = models.CharField(max_length=50)

    def __str__(self):
        return '%s %s' % (self.labe, self.code)


class Agent(models.Model):
    firstName = models.CharField(max_length=60)
    lastName = models.CharField(max_length=60)
    role = models.ManyToManyField(Role)

所以我创建了序列化器:

class RegistrationSerializer(serializers.ModelSerializer):
    role = serializers.PrimaryKeyRelatedField(
            many=True, read_only=True)
    
    class Meta:
        model = Agent
        fields = ['email', 'firstName', 'lastName', 'role',
                  'phoneNumber',  'experienceWorkYeares'],
        

    def save(self):

        agent = Agent.objects.create(
            email=self.validated_data['email'],
            firstName=self.validated_data['firstName'],
            lastName=self.validated_data['lastName'],
            phoneNumber=self.validated_data['phoneNumber'],
            experienceWorkYeares=self.validated_data['experienceWorkYeares']                
            role=self.validated_data['role'] // One of my multiple try but doesn`t work.

        )
        agent.save()

        return agent

如何检索我通过 Postman 发送的角色并将其放入代理中?对于我要发布的角色 role = "CODE1"。

非常感谢您。

基本上我想做的是:对于每个代理都有一个或多个角色。我尝试了很多事情并且我遵循文档但我无法做到。

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    首先,您的role 字段不应在Meta 类中声明,而应直接在ModelSerializer 中声明:

    class RegistrationSerializer(serializers.ModelSerializer):
         
        role = serializers.PrimaryKeyRelatedField(many=True, read_only=True)    
    
        class Meta:
             model = Agent
             fields = ['email', 'firstName', 'lastName', 'role',
                       'phoneNumber',  'experienceWorkYeares'],
             extra_kwargs = {
                 'password': {'write_only': True},
             }
    

    然后,如果你想写一个 ManyToManyField,你应该使用类似的东西:

    my_role = Role.objects.get(pk=self.validated_data['role'])
    agent.role.add(my_role)
    

    您可以做的另一件事是在您的序列化程序中添加一个validate_role(self, value) 方法,该方法检查提供的主键是否正确,并返回Role.objects.get(pk=value)——然后您将在validated_data 中获得角色实例。见this part of DRF doc

    【讨论】:

    • 感谢您的回复。我更新了帖子。我不想写角色。在前面我发送一个角色代码(“CODE123”)来填写代理。而且我不知道如何将代码 CODE123 的角色放入 Agen。
    • 好的,我明白了。您不能直接编写 ManyToManyField。见here。您应该使用my_role = Role.objects.get(pk=self.validated_data['role']) 获取角色实例,然后使用agent.role.add(my_role) 将其添加到字段中(在创建agent 之后)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多