我有一个拥有主键的模型id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
.
当PUT
请求被发送到资源的端点时,如果资源尚不存在,/api/v1/resource/<id>.json
我想用提供的资源创建新资源id
.
注意:我正在使用ModelViewSet
aModelSerializer
这样做最优雅的方式是什么?
我定义了两个数据库,default
这是一个常规的MySQL后端和redshift
(使用postgres
后端).我想将RedShift用作只用于django-sql-explorer的只读数据库.
这是我创建的路由器my_project/common/routers.py
:
class CustomRouter(object):
def db_for_read(self, model, **hints):
return 'default'
def db_for_write(self, model, **hints):
return 'default'
def allow_relation(self, obj1, obj2, **hints):
db_list = ('default', )
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return db == 'default'
Run Code Online (Sandbox Code Playgroud)
我的settings.py
引用如下:
DATABASE_ROUTERS = ['my_project.common.routers.CustomRouter', ]
Run Code Online (Sandbox Code Playgroud)
调用时出现问题makemigrations
,Django抛出一个错误,表明它正在尝试django_*
在RedShift中创建表(并且由于serial
RedShift不支持postgres类型,显然失败了:
...
raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" …
Run Code Online (Sandbox Code Playgroud) 我有一个模型,需要一些后期处理(我会生成该body
字段的MD5 )。
models.py
class MyModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
body = models.TextField()
md5 = models.CharField(max_length=32)
...
def save(self, *args, **kwargs):
if self.pk is None: # Only for create (edit disabled)
self.md5 = get_md5(self.body)
super(MyModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
问题在于,最终块将不会执行,因为我没有看到一种检查实例是否为新实例的方法:self.pk
永远不会None
因为在保存之前已填充UUID。
我想知道处理此问题的最佳做法。
提前致谢。
更新:
我能想到的唯一解决方案是直接调用数据库并:
id
存在modified
和created
字段以判断是否为编辑