Django REST POST用PK到HyperlinkedModelSerializer,如何将PK翻译成URL?

时间:2018-04-07 06:53:40

标签: python django rest django-rest-framework

我是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 翻译成它的网址。

任何帮助将不胜感激。我一直在寻找答案。谢谢!

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。这就是它无法找到它的原因。简单而完成。谢谢你的所有答案。