Как я могу обработать django вложенных моделей? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть модель User, Post и Tag в Django. Модель тега не подходит для этой топи c. Я могу получить все данные для внешнего интерфейса с вложенными объектами. С другой стороны, когда я хочу создать новое сообщение, я отправляю данные сообщения в django и в представлении django я пытаюсь обновить данные, связывая зарегистрированного пользователя с «сообщением», но когда я делаю это, оно дает мне;

  {'owner': {'username': [ErrorDetail(string='A user with that username already exists.', code='unique')]}}

ошибка. Как я могу решить эту ошибку?

models.py;

class Post(models.Model):
  # Post specs
  title = models.CharField(max_length=100, null=False)
  place = models.CharField(max_length=100, null=False)
  notes = models.CharField(max_length=10000, null=False)
  tags = models.ManyToManyField(Tag)
  start_date = models.DateField(null=True)
  end_date = models.DateField(null=True)
  created_at = models.DateField(auto_now=True)
  owner = models.ForeignKey(User , null = True, on_delete=models.SET_NULL) 

serializers.py;

class PostSerializer(serializers.ModelSerializer):
  tags = serializers.SlugRelatedField(
        many=True,
        queryset=Tag.objects.all(),
        slug_field='name'
     )
  owner = UserSerializer()
  class Meta:
    model = Post
    fields = ('title','place','notes','start_date','end_date','created_at','id','owner','tags')

Кстати, если я изменю serializer.py как владелец = UserSerializer это дает только значение первичного ключа. В начале я не могу ничего с целым числом, и я не хочу делать еще один вызов API для пользовательской модели. Наконец просмотреть функцию сообщения;

  def post(self, request, format =None):
    """
    Creates a post
    """
    post = request.data                          ## copy dictionary to a variable
    authenticatedUserDataAsDict =  request.user.__class__.objects.filter(pk=request.user.id).values().first()
    post.update( {'owner': authenticatedUserDataAsDict} )        ## attach authenticated user to post end
    serializer = PostSerializer(data = post)      ## serialize the dict
    if serializer.is_valid():
      serializer.save()                           ## if data valid save it.
      return Response(serializer.data, status = status.HTTP_201_CREATED)
    print("not valid->",serializer.errors)
    return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST) # if it's not raise http 400

1 Ответ

0 голосов
/ 01 апреля 2020

решено

Снова привет, кажется, что остальные фреймворки не имеют представления о нашем запросе (создать или получить мудрый), потому что мы имеем дело с вложенными сериализаторами. Так что я нашел эту статью в среде, и это помогло мне решить мою проблему.

...