在Django REST框架中发布带有字段的数据。

huangapple go评论99阅读模式
英文:

Post data with field in django REST framework

问题

I am designing my API using serializers.ModelSerializer and viewsets.ModelViewSet. I can post the foreignKey value using the id, but I want to post it using the name. Here is an example of what I mean:

我正在使用serializers.ModelSerializerviewsets.ModelViewSet来设计我的API。我可以使用id来发布foreignKey值,但我想使用name来发布它。这是我所说的示例:

I can post on this:

我可以这样发布:

  1. curl --request POST \
  2. --url http://127.0.0.1:8000/api/book/ \
  3. --header 'Content-Type: multipart/form-data' \
  4. --form author=1 \
  5. --form name=MY_BOOK

but I want do this:

但我想要这样做:

  1. curl --request POST \
  2. --url http://127.0.0.1:8000/api/book/ \
  3. --header 'Content-Type: multipart/form-data' \
  4. --form author=AUTHOR_NAME \
  5. --form name=MY_BOOK

I have tried to use to_internal_value, and it works, but I want to know if there is a better plan:

我尝试使用to_internal_value,它有效,但我想知道是否有更好的方案:

  1. def to_internal_value(self, data):
  2. data = data.copy()
  3. data['author'] = get_object_or_404(Author, name=data['author']).id
  4. return super().to_internal_value(data)

Here in my code:

这是我的代码中的部分:

  1. class Author(models.Model):
  2. name = models.CharField(max_length=128, unique=True)
  3. def __str__(self):
  4. return self.name
  5. class Book(models.Model):
  6. author = models.ForeignKey(Author, on_delete=models.CASCADE)
  7. name = models.CharField(max_length=128, unique=True)
  8. def __str__(self):
  9. return self.name
  10. class AuthorSerializer(serializers.ModelSerializer):
  11. class Meta:
  12. model = Author
  13. fields = '__all__'
  14. class BookSerializer(serializers.ModelSerializer):
  15. class Meta:
  16. model = Book
  17. fields = '__all__'
  18. def to_internal_value(self, data):
  19. data = data.copy()
  20. data['author'] = get_object_or_404(Author, name=data['author']).id
  21. return super().to_internal_value(data)

Any help or explanation is welcome! Thank you.

欢迎提供任何帮助或解释!谢谢。

英文:

I am designing my API using serializers.ModelSerializer and viewsets.ModelViewSet. I can post the foreignKey value using the id, but I want to post it using the name. Here is an example of what I mean:

I can post on this:

  1. curl --request POST \
  2. --url http://127.0.0.1:8000/api/book/ \
  3. --header 'Content-Type: multipart/form-data' \
  4. --form author=1 \
  5. --form name=MY_BOOK

but I want do this:

  1. curl --request POST \
  2. --url http://127.0.0.1:8000/api/book/ \
  3. --header 'Content-Type: multipart/form-data' \
  4. --form author=AUTHOR_NAME \
  5. --form name=MY_BOOK

I have try use to_internal_value it's work, but I think it want to know is there a better plan:

  1. def to_internal_value(self, data):
  2. data = data.copy()
  3. data['author'] = get_object_or_404(Author, name=data['author']).id
  4. return super().to_internal_value(data)

Here in my code:

  1. class Author(models.Model):
  2. name = models.CharField(max_length=128, unique=True)
  3. def __str__(self):
  4. return self.name
  5. class Book(models.Model):
  6. author = models.ForeignKey(Author, on_delete=models.CASCADE)
  7. name = models.CharField(max_length=128, unique=True)
  8. def __str__(self):
  9. return self.name
  10. class AuthorSerializer(serializers.ModelSerializer):
  11. class Meta:
  12. model = Author
  13. fields = '__all__'
  14. class BookSerializer(serializers.ModelSerializer):
  15. class Meta:
  16. model = Book
  17. fields = '__all__'
  18. def to_internal_value(self, data):
  19. data = data.copy()
  20. data['author'] = get_object_or_404(Author, name=data['author']).id
  21. return super().to_internal_value(data)

Any help or explanation is welcome! Thank you.

答案1

得分: 2

你可以使用SlugRelatedField来实现这个。像这样定义BookSerializer

  1. class BookSerializer(serializers.ModelSerializer):
  2. author = serializers.SlugRelatedField(slug_field="name", queryset=Author.objects.all())
  3. class Meta:
  4. model = Book
  5. fields = '__all__'
英文:

You can do this with SlugRelatedField. Define BookSerializer like this:

  1. class BookSerializer(serializers.ModelSerializer):
  2. author = serializers.SlugRelatedField(slug_field="name", queryset=Author.objects.all())
  3. class Meta:
  4. model = Book
  5. fields = '__all__'

huangapple
  • 本文由 发表于 2023年5月10日 11:04:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/76214622.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定