【问题标题】:Getting an attribute error in django.how do i resolve this?在 django 中出现属性错误。我该如何解决?
【发布时间】:2022-01-15 22:25:47
【问题描述】:

在 django 中的模型中获取属性错误。当我尝试在我的 model_list 模板中调用 model.get_absolute_url 时,它说模型没有属性“id” 在模型中,我还正确编写了 url 映射器和视图函数,包括详细信息模板 异常指向这条反向线 这是models.py文件中的模型

class Post(models.Model): 
    title=models.CharField(max_length=200,help_text="Write your title",primary_key=True)
    caption=models.TextField(help_text="Write something")
    image=models.FileField(blank=True)
    post_date=models.DateField(auto_now=True)
    class Meta:
        ordering=['post_date']
    def __str__(self):
        return self.title
    def __str__(self):
        return self.caption
    def get_absolute_url(self):
        return reverse('post-detail', args=[str(self.id)])

#here is the url path

urlpatterns +=[
    path('posts',views.PostListView.as_view(),name="post-list"),
    path('post/<int:pk>',views.PostDetailView.as_view(),name="post-detail")
    ]

【问题讨论】:

  • 分享相关模型和URL路径。
  • 我已经编辑了帖子,它现在包含模型和 url 路径
  • 通过将title设为主键,Django不会添加id作为主键,只有你自己不指定主键时才会这样,所以没有@987654324 @ 模型中的字段,主键现在是 string,不再是 int
  • 那么如何通过将标题主键设置为 False 来解决这个问题?
  • 从标题中删除主键后,这是我从终端对 makemigrations 请求的响应 * $ python manage.py makemigrations 您正在尝试添加一个不可为空的字段 'id'无默认发布;我们不能这样做(数据库需要一些东西来填充现有的行)。请选择一个修复:1)现在提供一次性默认值(将在所有现有行上设置此列的空值)2)退出,让我在 models.py 中添加默认值 选择一个选项:*

标签: python django


【解决方案1】:

扩展 Willem Van Onsem 的评论,根据您上次的评论重写模型,

class Post(models.Model): 
    title=models.CharField(max_length=200,help_text="Write your title")
    caption=models.TextField(help_text="Write something")
    image=models.FileField(blank=True)
    post_date=models.DateField(auto_now=True)
    class Meta:
        ordering=['post_date']
    def __str__(self):
        return self.title
    def __str__(self):
        return self.caption
    def get_absolute_url(self):
        return reverse('post-detail', args=[str(self.id)])

#here is the url path

urlpatterns +=[
    path('posts',views.PostListView.as_view(),name="post-list"),
    path('post/<int:pk>',views.PostDetailView.as_view(),name="post-detail")
    ]

现在来处理执行此操作后出现的错误。如果您正在开发中并且您的数据库中没有需要保留的数据,您可以删除并重新创建整个数据库并重新运行命令:

    python manage.py makemigrations
    python manage.py migrate

或者,

    python manage.py flush

来源:https://docs.djangoproject.com/en/4.0/ref/django-admin/#flush

但请注意,这将删除数据库中的所有数据。如果您需要保留数据,请查看 S.here 接受的答案:

将您的数据卸载到 JSON 文件中。使用 Django 自己的内部 django-admin.py 工具。您应该为 每个都将发生变化,每个表都依赖于一个键 正在创建。单独的文件使这更容易做到。

删除要从旧架构更改的表。

依赖于这些表的表将更改其 FK;你 可以更新行或 - 它可能更简单 - 到 删除并重新插入这些行。

创建新架构。这只会创建表 变化。

编写脚本以使用新键读取和重新加载数据。这些是 简短且非常相似。每个脚本都会使用 json.load() 来读取 源文件中的对象;然后,您将创建您的架构对象 来自为您构建的 JSON 元组行对象。然后你可以 将它们插入数据库。

你有两个案例。

更改 PK 的表将被插入并获得新表 PK的。这些必须“级联”到其他表,以确保 其他表的 FK 也发生了变化。

具有更改的 FK 的表必须在 外部表并更新其 FK 引用。

另一种选择。

重命名所有旧表。

创建整个新架构。

编写 SQL 将所有数据从旧模式迁移到新模式。这个 将不得不巧妙地重新分配密钥。

删除重命名的旧表。

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2020-12-27
    • 2018-09-23
    • 1970-01-01
    • 2020-08-18
    • 2021-09-10
    • 2019-10-05
    • 2019-12-22
    相关资源
    最近更新 更多