我是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.
答案 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有帮助并欢迎....