我是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.
首先,我建议从文本字段中删除“primary_key=True”。这使得它们独一无二并被编入索引——这意味着,没有人能够在tweet上发布相同的内容或评论相同的内容。此外,主键是为该记录的id保留的,不管它是自动生成的还是由您生成的。在
其次,您不需要在注释模型中的外键上使用
unique=False
第三,您不需要将评论模型与概要模型相关联,因为它是通过Tweet关联的。。。个人资料->微博->评论
所以:
可能更多的是你的想法
概要文件与AUTH_用户模型有一对一关系。一个配置文件可以有许多Tweet,一个Tweet可以有许多评论。在
要按用户名选择某人的推文和评论,您可以拨打:
^{pr2}$或按视图中的用户记录:
这将获取名为“incognos”的用户的所有tweet,并在同一个查询中选择与该tweet相关的所有注释。在
我希望这对Python和Django有帮助,并欢迎使用它。。。。在
相关问题 更多 >
编程相关推荐