gpt4 book ai didi

python - 带有 PK 的 Django REST POST 到 HyperlinkedModelSerializer,如何将 PK 转换为 URL?

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:19 25 4
gpt4 key购买 nike

我是 Django 和 Django REST 的新手。我一直在创建一个简单的练习项目。

模型:

class Locker(models.Model):
locker_owner = models.ForeignKey(User, related_name='lockers', on_delete=models.CASCADE)
locker_desc = models.CharField(max_length=100)
locker_rating = models.IntegerField(default=0)

序列化器:

class LockerSerializer(serializers.ModelSerializer):
locker_owner = serializers.HyperlinkedRelatedField(
view_name='user-detail',
lookup_field='id',
queryset=User.objects.all())
# how to add locker owner with id?

class Meta:
model = Locker
fields = ('url', 'locker_desc', 'locker_rating', 'locker_owner')

class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'id', 'username', 'email', 'groups')

观看次数:

class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer

class LockerViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows lockers to be viewed or edited.
"""
# def create(self, request):
queryset = Locker.objects.all()
serializer_class = LockerSerializer

我用它来发布:

ttp -f POST localhost:8000/lockers/ locker_owner_id=2 locker_desc='desc of locker 3' locker_rating=150

但是接下来的 react 是

"locker_owner": [ "This field is required." ]

要点:我想创建一个新的储物柜,并使用 User id 作为它的 locker_owner,但仍保持 HyperlinkedModelSerializer .它不会让我,因为他们需要 locker_owner 的 url。一旦我在我的 POST 请求的 locker_owner 中使用超链接,它就可以工作,但我不知道如何将 locker_owner=2 翻译成它的 url。

如有任何帮助,我们将不胜感激。这几天我一直在寻找答案。谢谢!

最佳答案

这不是开箱即用的事情。您将需要实现自己的自定义 serializer 字段,并覆盖 to_representation 方法:

serializers.py

from rest_framework.reverse import reverse


class CustomRelatedField(serializers.PrimaryKeyRelatedField):

def to_representation(self, value):
return reverse('<your-user-detail-view-name>', args=(value.pk,), request=self.context['request'])


class LockerSerializer(serializers.ModelSerializer):
locker_owner = CustomRelatedField(queryset=User.objects.all())

class Meta:
model = Locker
fields = ('url', 'locker_desc', 'locker_rating', 'locker_owner')

然后您可以简单地POST 一个简单的 JSON 来创建一个新的 Locker 对象:

{
"locker_owner": 2,
"locker_desc": 'desc of locker 3',
"locker_rating": 150
}

关于python - 带有 PK 的 Django REST POST 到 HyperlinkedModelSerializer,如何将 PK 转换为 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49704754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com