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] asprimary_key=True
to a model with nameid
if you do not specify a primary key yourself, so there is no need to explicitly declare a primary key.