Я использую Django REST Framework для предоставления API для своего мобильного приложения. Мне нужно отправить дополнительный аргумент, когда я создаю новое устройство по электронной почте своего владельца.Получить идентификатор недавно созданного объекта Django Rest Framework
На самом деле я отправить JSON, похожее на это:
{"os_type": "AND",
"token": "dfsdfdfsd",
"email": "[email protected]"
}
Мне нужно передать некоторые данные в стандартном ModelViewSet и перекрывает небольшую часть (извлечь электронную почту владельца и связать его с устройством недавно созданного. проблема заключается в том, что я не знаю, как получить идентификатор этого нового объекта
у меня есть эта ModelViewSet для моей модели устройств:.
class DeviceViewSet(viewsets.ModelViewSet):
queryset = Device.objects.all()
serializer_class = DeviceSerializer
def create(self, request):
"""
Overrides the create method in order to get
extra params: the email of the device's owner.
When this is done, we pass the method to his parent.
"""
print "creating..."
created = super(DeviceViewSet, self).create(request)
print type(created).__name__
#[method for method in dir(created) if callable(getattr(created, method))]
return created
«Creat ed "- это тип Response, который будет отображаться со всей информацией, но я хотел бы получить идентификатор более элегантным или правильным способом.
И это моя модель устройства:
class Device(models.Model):
"""
iOS or Android device, where is installed the app
"""
ANDROID = 'AND'
IOS = 'IOS'
OS_DEVICES_CHOICES = (
(ANDROID, 'Android'),
(IOS, 'iOS'),
)
os_type = models.CharField(max_length=3, choices=OS_DEVICES_CHOICES)
token = models.CharField(max_length=1000)
active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Я предпочитаю не добавить владельца поля в моей модели устройства, потому что у меня уже модель Владелец, который относится к устройству:
class Owner(models.Model):
name = models.CharField(max_length=200, blank=True, null=True)
biography = models.TextField(max_length=1000, blank=True, null=True)
birthday = models.DateField(blank=True, null=True)
country = models.CharField(max_length=50, blank=True, null=True)
language = models.CharField(max_length=50, blank=True, null=True)
email = models.EmailField(blank=True, null=True)
devices = models.ManyToManyField(Device)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return u'[{0}] {1}'.format(self.id, self.name)
def __unicode__(self):
return u'[{0}] {1}'.format(self.id, self.name)
Как решить эту проблему?
Вы просто пытаетесь сделать ассоциацию после создания объекта? (Только хэдз-ап, [это похоже на вопрос о стиле XY) (http://meta.stackoverflow.com/q/254341/359284)). Есть намного более простые способы сделать это на уровне представления или сериализатора, если это так. –
@KevinBrown Да, я хочу связать объект Device с объектом Owner после создания устройства. Контекст: у меня есть мобильное приложение, но я не прошу зарегистрироваться. Я беру его письмо автоматически и создаю нового владельца. Затем я отправляю register_token на сервер с его электронной почтой и свяжусь с ним. Наконец, приложение позволяет отправлять голоса и получать уведомления, но я все это сделал. – antonio
Во всяком случае, я думаю, что я решил исходную проблему, переопределив полную сохранность объекта сериализации, я не знал, что работает аналогично сохраненным формам. – antonio