问题描述
我的模型中有以下表示形式
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.
1楼
我可以建议您使用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
。
如果要创建许多项目,则应在ProjectModelSerializer
( ProjectModelSerializer(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
},
]