数据库列不存在

2024-04-19 16:38:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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。每当我尝试运行我的应用程序时,都会出现以下错误:

^{pr2}$

我已经完成了python manage.py makemigrations。另外,我在Comment中为profile外键添加了一个default=None,因为如果我不添加它,Django会对不可为null的字段抛出错误。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.

Tags: djangoinpydevselfhomemodelslib
1条回答
网友
1楼 · 发布于 2024-04-19 16:38:13

首先,我建议从文本字段中删除“primary_key=True”。这使得它们独一无二并被编入索引——这意味着,没有人能够在tweet上发布相同的内容或评论相同的内容。此外,主键是为该记录的id保留的,不管它是自动生成的还是由您生成的。在

其次,您不需要在注释模型中的外键上使用unique=False

第三,您不需要将评论模型与概要模型相关联,因为它是通过Tweet关联的。。。个人资料->微博->评论

所以:

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_用户模型有一对一关系。一个配置文件可以有许多Tweet,一个Tweet可以有许多评论。在

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

^{pr2}$

或按视图中的用户记录:

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

这将获取名为“incognos”的用户的所有tweet,并在同一个查询中选择与该tweet相关的所有注释。在

我希望这对Python和Django有帮助,并欢迎使用它。。。。在

相关问题 更多 >