gpt4 book ai didi

python - 获取最近创建的对象的 id Django Rest Framework

转载 作者:太空狗 更新时间:2023-10-30 00:31:56 25 4
gpt4 key购买 nike

我正在使用 Django REST Framework 为我的移动应用程序提供 API。当我创建新设备时,我需要将其所有者的电子邮件作为额外参数发送。

实际上我发送了一个类似这样的json:

{"os_type": "AND",
"token": "dfsdfdfsd",
"email": "sdfdfd@sdfs.com"
}

我需要将一些数据传递给标准 ModelViewSet 并覆盖一小部分(提取所有者的电子邮件并将其与最近创建的设备相关联。问题是我不知道如何获取这个新的 ID对象。

我的设备模型有这个 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

“创建的”对象是 Response 类型,它将使用所有 de 信息呈现,但我想以更优雅或正确的方式获取 ID。

这是我的设备型号:

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)

我该如何解决这个问题?

最佳答案

您可以在 Django REST Framework 中创建对象后执行操作 overriding perform_create on your view .

class DeviceViewSet(viewsets.ModelViewSet):
queryset = Device.objects.all()
serializer_class = DeviceSerializer

def perform_create(self, serializer):
from rest_framework.exceptions import ValidationError

data = self.request.data

if "email" not in data:
raise ValidationError({
"email": "No owner email provided",
})

try:
owner = Owner.objects.get(email=data["email"])
except Owner.DoesNotExist:
return Response(
'No owner with the email ({0}) found'.format(email),
status=status.HTTP_406_NOT_ACCEPTABLE
)

device = serializer.save()

owner.devices.add(device)

通过在 View 上覆盖 perform_create 而不是 create 方法,您不必担心对 create 进行的任何更改> 升级过程中您将缺少的方法。 perform_create 方法是推荐的钩子(Hook),因此您不必担心它会中断。

我还对在创 build 备之前进行的检查进行了一些更改。

  1. A ValidationError is being raised对于 400 错误,当电子邮件未随请求一起传递时。这将产生与其他字段相同样式的错误消息,应该由默认异常处理程序处理。
  2. try...except 仅限于 DoesNotExist 错误,如果用户提供与数据库中的所有者不匹配的无效电子邮件,将触发该错误.这将防止您压缩未考虑的边缘情况,though the DoesNotExist and MultipleObjectsReturned exceptions是您真正应该从 get 调用中收到的唯一内容。
  3. 未知电子邮件的错误不再包含异常通知,已经存在的消息应该没问题。

此外,如果有一种方法可以将发出请求的当前用户(在 request.user 中提供)与正在创建的设备的所有者(owner in在这种情况下),您可能希望跳过他们提供的电子邮件。这当然取决于 API 的功能,因为您可能有兴趣允许用户将设备绑定(bind)到其他所有者的帐户。

关于python - 获取最近创建的对象的 id Django Rest Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com