Когда я пытаюсь использовать syncdb, откуда происходит ошибка дубликата user_id? - PullRequest
1 голос
/ 16 февраля 2012

Трассировка выполняется в '' 'python manage.py syncdb' '' и происходит сразу после того, как пароль введен дважды. База данных sqlite3.

Отслеживание:

Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 109, in handle_noargs
    emit_post_sync_signal(created_models, verbosity, interactive, db)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/sql.py", line 190, in emit_post_sync_signal
    interactive=interactive, db=db)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-    packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 70, in create_superuser
    call_command("createsuperuser", interactive=True)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 166, in call_command
return klass.execute(*args, **defaults)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 134, in handle
    User.objects.create_superuser(username, email, password)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/contrib/auth/models.py", line 140, in create_superuser
    u = self.create_user(username, email, password)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/contrib/auth/models.py", line 136, in create_user
    user.save(using=self._db)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/base.py", line 570, in save_base
    created=(not record_exists), raw=raw, using=using)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Users/jonathan/pim/accounts/models.py", line 12, in create_user_profile
    UserProfile.objects.create(user = instance)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/manager.py", line 138, in create
    return self.get_query_set().create(**kwargs)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 360, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/base.py", line 553, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 1436, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 791, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/Cellar/python/2.7/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 234, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: column user_id is not unique

Мои модели.py ниже:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.db.models import ForeignKey
from django.db import models
from accounts.models import UserProfile

class CalendarEvent(models.Model):
    description = models.TextField()
    user_profile = models.ForeignKey(UserProfile)
    when = models.TextField()
    def __init__(self, when, description, user_profile):
        self.when = when
        self.description = description
        self.user_profile = user_profile
    def accepts(timestamp):
        if isinstance(timestamp, float):
            timestamp = time.asctime(time.localtime(timestamp))
        if timestamp[:4] == 'days':
            pass
        else:
            if re.match(self.when, timestamp):
                return True
            else:
                return False

Удаление подчеркивания из всех ссылок user_profile не меняет этого поведения.

Что я здесь не так делаю и как это исправить?

- EDIT -

Источник проекта: http://JonathansCorner.com/project/pim.tgz.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Примечание: мой предыдущий ответ был удален вместо этого правильного ответа ...

Проблема в том, что ваш сигнал post_save подключается несколько раз каждый раз, когда accounts.models импортируется чем-либо. На самом деле вы хотите переместить сигнальное соединение в файл management.py в приложении учетных записей

Счета / models.py

from django.contrib.auth.models import User
from django.db import models

class UserProfile(models.Model):
    name = models.TextField()
    scratchpad = models.TextField()
    user = models.OneToOneField(User)
    timezone_offset = models.IntegerField(default = 0)


def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user = instance)

Счета / management.py

from django.db.models.signals import post_save
from accounts.models import create_user_profile
from django.contrib.auth.models import User

post_save.connect(create_user_profile, sender = User)

django загрузит ваш модуль management.py один раз, поэтому теперь подключается только один сигнал, независимо от того, сколько раз были импортированы ваши account.models

1 голос
/ 16 февраля 2012

Вы подключаете сигнал User post_save дважды, потому что вы импортируете модуль моделей учетных записей по двум разным путям. Это означает, что вы пытаетесь создать два профиля пользователя для своего нового суперпользователя, и это не удается во второй раз.

Когда Django импортирует приложение для учетных записей, путь к моделям - account.models. Однако когда django импортирует pim 'app' (на самом деле это не приложение, это корень проекта, подробнее об этом позже), модуль account.models снова импортируется как pim.accounts.models.

Самый быстрый способ решить эту проблему - использовать уникальный идентификатор при подключении сигнала после сохранения.

post_save.connect(create_user_profile, sender = User, dispatch_uid="create_user_profile")

Лучше исправить сортировку импорта и макета проекта:

  • создайте отдельное приложение для вашего models.py, содержащее модель CalendarEvent, вместо того, чтобы помещать его в корень проекта.
  • вы можете назвать ваше приложение 'pim' внутри вашего проекта 'pim', если хотите
  • переместите ваши models.py, admin.py и, возможно, некоторые из них, если ваши URL-адреса, в новое приложение

Если вы в данный момент разрабатываете, тогда проще всего удалить таблицу профилей пользователей и позволить syncdb воссоздать ее. Или вы можете удалить ненужные профили пользователей в оболочке.

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