gpt4 book ai didi

python - 数据库列不存在

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:45 24 4
gpt4 key购买 nike

我是 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

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

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.

最佳答案

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

其次,您在 Comment 模型中的外键上不需要 unique=False

第三,您不需要将 Comment 模型关联到 Profile 模型,因为它是通过 Tweet 关联的... Profile -> Tweet -> Comment

所以:

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')

或通过 View 中的用户记录:

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

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

我希望这对您有所帮助,欢迎使用 Python 和 Django...

关于python - 数据库列不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com