当前位置: 代码迷 >> python >> 使用DRF将行添加到m2m表
  详细解决方案

使用DRF将行添加到m2m表

热度:27   发布时间:2023-07-14 09:49:38.0

我的模型中有以下表示形式

class Agent(models.Model):
    name = models.CharField(max_length=200)
    user = models.OneToOneField(SampignanUser, on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Project(models.Model):
    client = models.ForeignKey(Client, related_name='projects', on_delete=models.CASCADE)
    agent = models.ManyToManyField(Agent)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

我想创建一个其他端点,在其中我可以让一个代理申请特定的项目(即-在Project-agents表中创建一行)。 有什么特别的方法可以做到吗? 现在,我已经尝试了以下方法

urls.py

urlpatterns = [
    path('projects/<int:project_id>/apply/', views.project_application, name='apply')
]

views.py

@api_view(['GET','POST'])
def project_application(request, project_id):

    if request.method == 'GET':
        serializer = ProjectApplicationSerializer()
        // show an empty form to the user
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = ProjectApplicationSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的serializers.py

class ProjectApplicationSerializer(serializers.ListSerializer):

    agent = AgentSerializer
    project = ProjectSerializer

它似乎不起作用,但是,我从Django得到以下错误

`child` is a required argument.

我可以建议您使用serializers.ModelSierializer 因此它看起来像:

class ProjectModelSerializer(serializers.ModelSerializer):
   class Meta:
      model = Project
      fields = [..., 'agent',....] # you can use exclude also

   def to_representation(self, instance):
      self.fields['agent'] = AgentSerializer(many=True)
      return super().to_representation(instance)

在这里, ModelSerializer自动处理多对多字段。 此外,在显示结果时,您可以在序列化器的to_representation(self, instance)方法中定义代理时将agent作为对象返回。 因此,它不仅会返回数组中代理的ID,而且还会返回定义为AgentSerializer 如果要创建许多项目,则应在ProjectModelSerializerProjectModelSerializer(data=request.data, many=True) )中使用many=True关键字,并且请求正文将如下更改:

[
  {
   .... # project data,
   agents = [1,2,3,4,5,...], # primary keys of Agents
  },
  {
   .... # project data,
   agents = [1,2,3,4,5,...], # primary keys of Agents
  },
]
  相关解决方案