обновлять посторонние предметы из оболочки django - PullRequest
0 голосов
/ 26 сентября 2011

Ниже приводится models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    belongs_to_user_category = models.ForeignKey(UserCustomCategory, null=True, blank=True)

class UserHistory(models.Model):
    date_time = models.DateTimeField()
    user = models.ForeignKey(UserProfile, null=True, blank=True)
    points_earned = models.DecimalField(max_digits=5, decimal_places=3)

, как ясно, история пользователя является внешним ключом для UserProfile.Для целей тестирования я хотел обновить точки пользователя, чье имя начинается с a

. Я написал следующий код в оболочке python:

from myapp.models import *
uobj = UserProfile.objects.all()
for i in uobj:
    if i.user.username[0] == 'a':
        b = UserHistory.objects.create(user=i)
        b.points_earned = random.random(10, 100)
        b.date_time = datetime.datetime.now()
        b.save()

Я также пытался b = UserHistory.objects.get_or_create(user=i) с той же ошибкой, и я получаю следующую ошибку:

ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (160, 0))

ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (13, 0))

ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (63, 0))

ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/IPython/ultraTB.py", line 667, in text
    locals,formatvalue=var_repr))
  File "/usr/lib/python2.6/inspect.py", line 875, in formatargvalues
    specs.append(strseq(args[i], convert, join))
  File "/usr/lib/python2.6/inspect.py", line 830, in strseq
    return convert(object)
  File "/usr/lib/python2.6/inspect.py", line 872, in convert
    return formatarg(name) + formatvalue(locals[name])
KeyError: 'connection'

IPython's exception reporting continues...

---------------------------------------------------------------------------
IntegrityError                            Traceback (most recent call last)


IntegrityError: (1048, "Column 'date_time' cannot be null")

1 Ответ

1 голос
/ 26 сентября 2011

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

Сначала вы захотите создать UserHistory объект, но на самом деле не сохраняйте его. Это делается путем простого создания экземпляра этого класса модели с любыми значениями по умолчанию, которые вы хотите:

b = UserHistory(user=i)

После этого вы можете установить другие атрибуты.

b.points_earned = random.randint(10, 100)
b.date_time = datetime.datetime.now()
b.save()

И это будет работать. Потому что теперь вы сохраняете b после того, как вы установили date_time.

Конечно, есть способы улучшить это, вы можете просто создать все за один вызов, поскольку вы делаете это за один логический шаг, например:

b = UserHistory.objects.create(
  user=i,
  points_earned=random.randint(10, 100),
  date_time=datetime.datetime.now(),
)

Вы можете улучшить это, прочитав документацию DateField для Django, которая даст вам несколько советов о том, как установить дату по умолчанию для текущего времени.

Надеюсь, это поможет!

...