Добавление строки в таблицу m2m с использованием DRF - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть представленное ниже представление в моем models.py

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

Я хочу создать конечную точку отдыха, где я могу попросить агента подать заявку на конкретный проект (т. Е. Создать строку в проектетаблица агентов).Есть ли конкретный способ, которым я могу это сделать?Прямо сейчас я попробовал следующий подход

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)

My serializers.py

class ProjectApplicationSerializer(serializers.ListSerializer):

    agent = AgentSerializer
    project = ProjectSerializer

Кажется, он не работает, я получаю приведенную ниже ошибку от Django

`child` is a required argument.

1 Ответ

0 голосов
/ 23 сентября 2018

Я могу посоветовать вам использовать 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) сериализатора.Таким образом, он будет возвращать не только идентификатор агентов в массиве, но и дополнительную информацию, определенную AgentSerializer.Если вы хотите создать много проектов, вы должны использовать ключевое слово many=True в ProjectModelSerializer (ProjectModelSerializer(data=request.data, 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
  },
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...