Результат запроса к базе данных в качестве значения по умолчанию для поля модели Django? - PullRequest
3 голосов
/ 06 августа 2011
models.py
class Aref5(models.Model):
    name = Aref5.objects.all.order_by('id')[0]
    Rthink = models.TextField(max_length=2000,  blank=True, default=name)
    <....>

Я бы хотел, чтобы значение default Rthink было id последнего элемента.

С приведенным выше кодом я получаю сообщение о том, что Aref5 не распознается. Как я могу получить доступ к существующим Aref5 экземплярам в определении Aref5?

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Здесь есть пара проблем. Во-первых, если бы это работало, name будет вычисляться один раз при запуске Django, и каждый экземпляр Aref5 получит одно и то же значение по умолчанию. Другая причина заключается в том, что попытка доступа к классу в его определении приводит к ошибке.

Аргумент default для TextField (или любого подкласса Field) может быть вызываемым вместо значения, в этом случае он будет вызываться при создании нового объекта. Примерно так должно работать:

Rthink = models.TextField(max_length=2000, blank=True, default=lambda: str(Aref5.objects.latest('id').id))

Поскольку выражение, включающее Aref5, появляется внутри тела функции, оно не вычисляется сразу.

0 голосов
/ 09 января 2019

Согласно недавней документации для значения по умолчанию This can be a value or a callable object. If callable it will be called every time a new object is created.

The default can’t be a mutable object (model instance, list, set, etc.), as a reference to the same instance of that object would be used as the default value in all new model instances. Instead, wrap the desired default in a callable.

Пример:

def contact_default():
    return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)

lambdas can’t be used for field options like default because they can’t be serialized by migrations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...