使用 ModelViewSet 和 DjangoObjectPermissions。
Django REST 框架似乎不会为“创建”请求 (POST) 调用 check_object_permission。我需要检查用户是否可以在将其保存到数据库之前创建此对象(因为权限检查取决于对象值)
我想我需要覆盖 ModelViewSet 的“创建”方法,但我不知道如何从序列化程序获取实例而不将其保存到数据库。
谢谢
编辑:
深入研究 DRF 代码后,我无需保存即可获取实例:
def create(self, request, *args, **kwargs):
serializer = WorkedHourSerializer(data=request.data)
if serializer.is_valid():
instance = MyModel(**serializer.validated_data)
Run Code Online (Sandbox Code Playgroud)
但是 Django 拒绝检查 perm 没有主键的对象,所以我必须强制一个:
instance.id = 0
self.check_object_permissions(request, instance)
Run Code Online (Sandbox Code Playgroud) 尝试从 android studio 运行 android 模拟器时出现以下错误。我在 Manjaro (Arch linux) 上使用 Wayland 图形管理器。
WARN - manager.EmulatorProcessHandler - Emulator terminated with exit code 134
Run Code Online (Sandbox Code Playgroud)
我尝试过许多设备,包括没有 Playstore 的 Nexus 4,这样我就可以将 RAM 调整为 2GiB,并将图形性能调整为“软件”。但没有任何办法,我总是面临这个问题。
在开发环境中,有一种方法可以让 django 在“迁移”命令上自动创建数据库(在 postgreSQL 服务器上),就像创建测试数据库时一样?
我的最终目标是为每个 git 分支建立一个数据库。
有这些模型和关系:
Hours --FK--> Task --FK--> Project <--FK-- Period
class Hour(models.Model):
date = models.DateField(...)
task = models.ForeignKey(Task, ...)
class Task(models.Model):
project = models.ForeignKey(Project, ...)
class Project(models.Model):
pass
class Period(models.Model):
project = models.ForeignKey(Project,...)
start = models.DateField(...)
end = models.DateField(...)
Summary :
Hour has one task
Task has one project
Period has one project
Hour has a date
Period has a start date and a end date
Run Code Online (Sandbox Code Playgroud)
对于给定日期和给定项目,可能有一个时期或没有时期
我想以相同的方式填充对象period中的字段(使用查询集)Hourprefetch_related
我想要这样的东西:
hours = Hour.objects.prefetch_period().all()
hours.first().period # Period(...)
Run Code Online (Sandbox Code Playgroud)
使用像这样的自定义查询集方法:
class HourQuerySet(models.query.QuerySet): …Run Code Online (Sandbox Code Playgroud) 我问自己在mixin中覆盖save方法是否有意义.
在我的项目中,我有充分的理由在几个模型中覆盖save方法.首先,我必须创建一个继承自的模型类models.Model.无论从语义上讲,我正在做的是给一个类一个角色(而不是自己定义一个对象),这就是为什么我认为写一个mixin更好.另一个原因是因为我们可能在不久的将来使用多重继承.另一方面,这一行在重写保存方法中:
super(MyMixin, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
不会产生敏感,因为它只能与django.db.models.Model类一起使用.
class MyMixin(object):
def save(self, *args, **kwargs):
...
super(MyMixin, self).save(*args, **kwargs)
...
Run Code Online (Sandbox Code Playgroud)
你能帮我决定最好的选择吗?(Mixin或定制型号)