我是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
我用它来POST:
ttp -f POST localhost:8000/lockers/ locker_owner_id=2 locker_desc='desc of locker 3' locker_rating=150
然后回复是
" locker_owner":[ "此字段是必填字段。" ]
要点: 我想 创建新的储物柜 ,并使用用户ID作为其locker_owner,但仍然维护 HyperlinkedModelSerializer 。它不会让我,因为他们需要为locker_owner提供网址。一旦我在POST请求的locker_owner中使用超链接就可以了,但我不知道如何将 locker_owner = 2 翻译成它的网址。
任何帮助将不胜感激。我一直在寻找答案。谢谢!
答案 0 :(得分:1)
这不是你可以开箱即用的东西。您需要实现自己的自定义enum TokenLength {
SIX = 6,
EIGHT = 8
}
字段,并覆盖serializer
方法:
<强> serializers.py 强>
to_representation
然后,您可以简单地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')
一个简单的JSON来创建一个新的POST
对象:
Locker
答案 1 :(得分:0)
我自己找到了可用的教程解决方案。其他答案并未真正完全回答这个问题。
对于那些想要保存外键的url的人,这里,locker_owner,只是使用超链接相关字段获取它们
在我的序列化程序中:
class LockerSerializer(serializers.HyperlinkedModelSerializer):
locker_owner=serializers.HyperlinkedRelatedField(
read_only=True,
view_name='user-detail')
class Meta:
model = Locker
fields = ('locker_desc', 'locker_rating', 'locker_owner')
我试图在查找字段中获取id,但实际上查找字段正在从我的url中搜索id。这就是它无法找到它的原因。简单而完成。谢谢你的所有答案。