【问题标题】:Django Rest Framework - perform Put request by passing a JSON object instead of just IDDjango Rest Framework - 通过传递 JSON 对象而不仅仅是 ID 来执行 Put 请求
【发布时间】:2019-02-18 13:33:10
【问题描述】:

我正在使用 Python(3)、Django(1.11) 和 DRF(3.6) 开展一个项目,其中我必须通过传递 nested nested 而不是 ID 来执行 PUT 请求。

这是我尝试过的:

models.py:

class Actor(models.Model):
    id = models.CharField(primary_key=True, max_length=255)
    login = models.CharField(max_length=255)
    avatar_url = models.URLField(max_length=500)


class Repo(models.Model):
    id = models.CharField(primary_key=True, max_length=255)
    name = models.CharField(max_length=255)
    url = models.URLField(max_length=500)


class Event(models.Model):
    id = models.CharField(primary_key=True, max_length=255)
    type = models.CharField(max_length=255)
    actor = models.ForeignKey(Actor, related_name='actor')
    repo = models.ForeignKey(Repo, related_name='repo')
    created_at = models.DateTimeField()

serializers.py:

class ActorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Actor
        fields = ('id', 'login', 'avatar_url')


class RepoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Repo
        fields = ('id', 'name', 'url')


class EventModelSerializer(serializers.ModelSerializer):
    actor = ActorSerializer(many=False)
    repo = RepoSerializer(many=False)

    class Meta:
        model = Event
        fields = ('id', 'type', 'actor', 'repo', 'created_at')
        depth = 1

    def create(self, validated_data):
        return Event.objects.create(**validated_data)

更新:当我提交带有以下对象的发布请求时:

{
  "id":ID,
  "type":"PushEvent",
  "actor":{
    "id":ID,
    "login":"daniel33",
    "avatar_url":"https://avatars.com/2790311"
  },
  "repo":{
    "id":ID,
    "name":"johnbolton/exercitationem",
    "url":"https://github.com/johnbolton/exercitationem"
  },
  "created_at":"2015-10-03 06:13:31"
}

它返回此错误为:TypeError: 'ValueError: Cannot assign "OrderedDict([('id', '2790311'), ('login', 'daniel33'), ('avatar_url', 'https://avatars.com/2790311')])": "Event.actor" must be a "Actor" instance.

views.py:

class Actor(generics.GenericAPIView):
    serializer_class = EventModelSerializer
    queryset = EventModel.objects.all()

    def update(self):
        actor = EventModel.objects.filter(actor_id=self.request.data('id'))
        print(actor)
        return HttpResponse(actor)

Sample Input Object:

{
  "id":3648056,
  "login":"ysims",
  "avatar_url":"https://avatars.com/modified2"
}

要求是: 更新actor的头像URL:服务应该能够通过/actors的PUT请求更新演员的头像URL。演员 JSON 在请求正文中发送。如果具有 id 的参与者不存在,则响应代码应为404,或者如果该参与者有其他字段正在更新,则 HTTP 响应代码应为 400,否则,响应代码应为 @987654338 @.**

我有点困惑如何在没有的情况下执行PUT 请求 传递ID?

【问题讨论】:

    标签: python django django-rest-framework drf-queryset


    【解决方案1】:

    我看到你今天提出的两三个问题。我想你问错问题了。我认为您需要的是三个模型Eventactorrepoevent 模型有两个外键字段actorrepo。现在您希望它更新 actor 模型的 avtar_url 字段。好吗?

    class Actor(models.Model):
            avtar_url = models.CharField(max_length=255)
           # Other Fields
    
    class Repo(models.Model):
           # Other Fields
    
    class EventModel(models.Model):
            id = models.CharField(primary_key=True, max_length=255)
            type = models.CharField(max_length=255)
            actor = models.ForaignKey(Actor)
            repo = models.ForaignKey(Actor)
            created_at = models.DateTimeField()
    

    现在创建和更新 NESTED EventModel 条目使用 writable-nested-serializers。这样,您可以通过其 id 直接更新Actoravatar_url

    按要求更新

    您需要更改您的create 方法,以便创建ActorRepo 并将它们的ID 链接到Event

    def create(self, validated_data):
            actor = validated_data.pop('actor')
            repo = validated_data.pop('repo')
            actor = Actor.objects.create(**actor)
            repo = Repo.objects.create(**repo)
            return Event.objects.create(actor=actor,repo=repo,**validated_data)
    

    【讨论】:

    • 嗨@ashwin bande,我已经更新了我的modelsserializers,但是出现了另一个错误,我需要如何更改我的serializers
    • 现在返回{ "actor": [ "Invalid pk \"{'id': 2790311, 'login': 'daniel33', 'avatar_url': 'https://avatars.com/2790311'}\" - object does not exist." ], "repo": [ "Invalid pk \"{'id': 352806, 'name': 'johnbolton/exercitationem', 'url': 'https://github.com/johnbolton/exercitationem'}\" - object does not exist." ] }
    • 我知道了,我的最后有一个错字。
    • 所以它有效吗?如果是这样,请将答案标记为已接受,以便其他人知道这是一个可行的解决方案。
    • 我卡在update 方法上,如何定义更新?
    猜你喜欢
    • 2015-02-11
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    相关资源
    最近更新 更多