我的Django应用程序上有以下视图,我需要更新一个对象

status_id是一个ForeignKey字段,它有一些默认值通过fixture加载

def stopObject(request, id_object):
    object = Object.objects.get(id=id_object)
    object.status_id = 1
    object.save()

我得到了一个classic 的错误,我需要分配对象,而不是它的ID.有无数的问题在SO上,关于这个问题,但我来寻找一个我没有找到的答案

我非常清楚,我可以从数据库中执行一次提取并分配给status,但我想探索其他可能性,即使它们可能不是最佳实践,

编辑分享模型:

class Status(models.Model):
    id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=32, unique=True)

class Object(models.Model):
    id = models.AutoField(primary_key=True)
    status_id = models.ForeignKey(Status,
                                  db_column="status_id",
                                  default=3,
                                  null=True,
                                  blank=True,
                                  related_name='objects',
                                  on_delete=models.SET_NULL)
    # other fields

推荐答案

status_idForeignKey.

通常情况下,不会在ForeignKey字段中添加后缀…_id,因为Django会自动添加一个后缀…_id的"孪生"字段.因此,它应该是status,而不是status_id,所以:

class Object(models.Model):
    status = models.ForeignKey(
        Status,
        default=3,
        null=True,
        blank=True,
        related_name='objects',
        on_delete=models.SET_NULL,
    )

这也避免了必须指定db_column='status_id'.

如果将字段重命名为status,则可以使用status_id.如果没有,您可以使用用途:

# if the field is named status
def stopObject(request, id_object):
    object = Object.objects.get(id=id_object)
    object.status_id = 1
    object.save()

如果您出于某种原因决定保持status_id,我们可以使用:用途:

# if the field is remains status_id
def stopObject(request, id_object):
    object = Object.objects.get(id=id_object)
    object.status_id_id = 1
    object.save()

您可以通过更新Object来进一步提高性能,而不是获取和保存:

# if the field is remains status_id
def stopObject(request, id_object):
    object = Object.objects.filter(id=id_object).update(status_id_id=1)

或使用重命名的字段:

# if the field is named status
def stopObject(request, id_object):
    object = Object.objects.filter(id=id_object).update(status_id=1)

一百零三:Django默认会将AutoField [Django-doc]作为primary_key=True添加到一个名为id的模型中,如果你自己没有指定一个主键,所以不需要显式声明主键.

Django相关问答推荐

Django在保存时更新m2m对象

Djnago admin中 Select 字段的自定义查询

无法将关键字average_rating解析为字段

如何从基于类的视图将用户保存在 django 模型中

Django rest framework, AttributeError: 'str' object has no attribute 'data' 无法使用表单上传图片

Django rest框架:自定义对象权限不起作用

断开连接不会发生

Django模型中的密码字段

Django 嵌套事务 - with transaction.atomic()

如何在不使用 sudo 的情况下安装 virtualenv?

如何使用 django-nose 运行单个测试或单个 TestCase?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

在 Mac OS X 上安装支持 JPEG 的 PIL

Django 发送邮箱

登录后django重定向不起作用next不发布?

如何在 Django 中使用动态外键?

Django模板转换为字符串

基于 User-Agent 更改 Django 模板

Django 模型(1054,Unknown column in 'field list')

如何更改模型标签并给它一个自定义名称