小编Dan*_*men的帖子

在Django Rest Framework中创建或更新(使用PUT)

我有一个拥有主键的模型id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False).

PUT请求被发送到资源的端点时,如果资源尚不存在,/api/v1/resource/<id>.json我想用提供的资源创建新资源id.

注意:我正在使用ModelViewSetaModelSerializer

这样做最优雅的方式是什么?

api django django-rest-framework

10
推荐指数
1
解决办法
4438
查看次数

使用RedShift作为额外的Django数据库

我定义了两个数据库,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中创建表(并且由于serialRedShift不支持postgres类型,显然失败了:

...
raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" …
Run Code Online (Sandbox Code Playgroud)

python django postgresql orm amazon-redshift

6
推荐指数
1
解决办法
723
查看次数

使用UUIDField作为主键时,如何判断模型实例是否是新的

我有一个模型,需要一些后期处理(我会生成该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。

我想知道处理此问题的最佳做法。

提前致谢。

更新:

我能想到的唯一解决方案是直接调用数据库并:

  1. 检查是否id存在
  2. 比较modifiedcreated字段以判断是否为编辑

python django uuid

5
推荐指数
2
解决办法
1117
查看次数