Django Rest Framework - выполнить запрос Put, передавая объект JSON вместо просто ID
Я работаю над проектом с использованием Python(3), Django(1.11) и DRF(3.6), в котором я должен выполнить PUT
запрос, передав nested nested
вместо ID
,
Вот что я попробовал:
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"
}
Требования: Обновление URL аватара actor
: Служба должна иметь возможность обновлять URL-адрес аватара субъекта по запросу PUT на /actors
, Актер JSON отправляется в теле запроса. Если субъект с идентификатором не существует, тогда код ответа должен быть 404
или если для актера обновляются другие поля, то код ответа HTTP должен быть 400
в противном случае код ответа должен быть 200
.**
Я немного запутался в том, как выполнить
PUT
запрос без прохожденияID
?
1 ответ
Я видел ваши два-три вопроса, которые задали сегодня. Я думаю, что вы задаете неправильный вопрос. Я думаю, что вам нужно три модели Event
, actor
а также repo
, event
Модель имеет два поля внешнего ключа как actor
а также repo
, Теперь, что вы хотите, чтобы обновить 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
запись использовать writeable-nested-serializer. Таким образом, вы можете напрямую обновить avatar_url
за Actor
по его идентификатору.
ОБНОВЛЕНИЕ согласно запросу
вам нужно изменить свой create
метод следующим образом, так что он создает Actor
, Repo
и связать их идентификаторы с 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)