Django: "Cannot assign must be a "X" instance", не хочет получать объект

У меня есть следующее представление в моем приложении Django, и мне нужно обновить один объект

status_id - это поле ForeignKey, которое имеет некоторые значения по умолчанию, загружаемые с помощью приспособлений

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

Я получаю классическую ошибку, когда мне нужно присвоить объект, а не его Id. На SO есть бесчисленное количество вопросов по этой проблеме, но я искал ответ и не нашел

Я прекрасно знаю, что могу просто выполнить выборку из базы данных и присвоить значение status, но я хочу изучить другие возможности, даже если они могут быть не самыми лучшими практиками

EDIT делится моделями:

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_id - это ForeignKey.

Обычно не добавляют суффикс …_id к полю ForeignKey, так как Django автоматически добавит поле-"близнец" с суффиксом …_id. Поэтому вместо status_id должно быть status, так:

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)

Note: Django will add by default an AutoField [Django-doc] as primary_key=True to a model with name id if you do not specify a primary key yourself, so there is no need to explicitly declare a primary key.

Вернуться на верх