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_idstatus, так:
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=Trueto a model with nameidif you do not specify a primary key yourself, so there is no need to explicitly declare a primary key.