数据库列不存在

时间:2015-08-18 01:37:04

标签: python django

我是Django的新手,正在为练习创建一个小型的Twitter应用程序。我有以下模型设置

class Profile(models.Model):
    #Relations
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        related_name="profile",
        verbose_name=_("user"),
        primary_key=True,
        )

    interaction = models.PositiveIntegerField(
        default=0,
        verbose_name=_("interaction")
        )

    # Object Manager
    objects = managers.ProfileManager()

    #Custom Properties
    @property
    def username(self):
        return self.user.username

    #Methods

    #Meta and String
    class Meta:
        verbose_name = _("Profile")
        verbose_name_plural = _("Profiles")
        ordering = ("user",)

    def __str__(self):
        return self.user.username

@receiver(post_save,sender=settings.AUTH_USER_MODEL)
def create_profile_for_new_user(sender,created,instance,**kwargs):
    if created:
        profile = Profile(user=instance)
        profile.save()

class Tweet(models.Model):

    profile = models.ForeignKey(Profile,unique=False)
    text = models.CharField(max_length=100,primary_key=True)

    class Meta:
        verbose_name = _("Tweet")
        #ordering = ("profile","text")
    def __str__(self):
        return self.text

class Comment(models.Model):

    profile = models.ForeignKey(Profile,unique = False,default=None)
    tweet = models.ForeignKey(Tweet,unique=False)
    text = models.CharField(max_length=100,primary_key=True)

    def __str__(self):
        return self.text

我希望评论模型有两个外键:一个是发布它的用户,另一个是Tweet,它是评论。每当我尝试运行我的应用程序时,我都会收到以下错误:

column taskmanager_comment.profile_id does not exist
LINE 1: SELECT "taskmanager_comment"."profile_id", "taskmanager_comm...

我做过python manage.py makemigrations。另外,我在Comment中的配置文件外键中添加了default=None,因为如果我不添加它,Django会为非可空字段抛出错误。 python manage.py migrate每次运行时都会抛出以下错误:

 File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 221, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/db/migrations/executor.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/db/migrations/executor.py", line 147, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/db/migrations/migration.py", line 115, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/home/lie/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 467, in alter_field
    old_field.rel.through._meta.auto_created and
AttributeError: 'str' object has no attribute '_meta'

我不确定此错误是否可能导致上一个错误。任何想法如何解决这些错误?

编辑:迁移:

 python manage.py makemigrations
Migrations for 'taskmanager':
  0001_initial.py:
    - Create model Comment
    - Create model MyModel
    - Create model Profile
    - Create model Tweet
    - Add field profile to comment
    - Add field tweet to comment
(tb_dev)lie@lie-bot:~/taskbuster_project$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: google, staticfiles, allauth, messages
  Apply all migrations: sessions, account, taskmanager, socialaccount, contenttypes, admin, auth, sites
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.

1 个答案:

答案 0 :(得分:1)

首先,我建议从文本字段中删除`primary_key = True'。这使得它们具有独特性和索引性 - 这意味着,没有人能够发布相同的内容或评论相同的内容。此外,主键是为该记录的id保留的,无论是自动生成还是由您生成。

其次,评论模型中的外键上不需要unique=False

第三,您不需要将Comment模型与Profile模型相关联,因为它与Tweet ... Profile - &gt;相关联。推文 - &gt;评论

所以:

class Profile(models.Model):
    # a field of 'id' is automatically generated for you as the primary key

    #Relations
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        verbose_name=_("user"),
        )

    interaction = models.PositiveIntegerField(
        default=0,
        verbose_name=_("interaction")
        )

    # Object Manager
    objects = managers.ProfileManager()

    #Custom Properties
    @property
    def username(self):
        return self.user.username

    #Methods

    #Meta and String
    class Meta:
        verbose_name = _("Profile")
        verbose_name_plural = _("Profiles")
        ordering = ("user",)

    def __str__(self):
        return self.user.username


@receiver(post_save,sender=settings.AUTH_USER_MODEL)
def create_profile_for_new_user(sender,created,instance,**kwargs):
    if created:
        profile = Profile(user=instance)
        profile.save()

class Tweet(models.Model):
    # a field of 'id' is automatically generated for you as the primary key

    profile = models.ForeignKey('Profile')
    text = models.CharField(max_length=100)

    class Meta:
        verbose_name = _("Tweet")
        #ordering = ("profile","text")
    def __str__(self):
        return self.text

class Comment(models.Model):
    # a field of 'id' is automatically generated for you as the primary key
    profile = models.ForeignKey('Profile')
    tweet = models.ForeignKey('Tweet')
    text = models.CharField(max_length=100)

    def __str__(self):
        return self.text

可能更多是你的想法

配置文件与AUTH_USER模型具有一对一的关系。个人资料可以有多个推文,推文可以有很多评论。

要按用户名选择某人的推文和评论,您可以致电:

tweets = Tweet.objects.filter(profile__user__username='incognos').select_related('comments')

或视图中的用户记录:

tweets = Tweet.objects.filter(profile__user=request.user).select_related('comments')

这将获得名为“incognos”的用户发送的所有推文,并在同一查询中选择该推文的所有相关评论。

我希望这对Python和Django有帮助并欢迎....