python - 迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()
问题描述
这是一个有 2 个问题的帖子,我怀疑它们之间存在某种联系。我在 Django 上的帖子应用程序没有正确迁移(我认为),并且添加“作者”(用户 AbstractUser 模型)会破坏我的代码并出现错误:
str返回非字符串(类型元组)
每当我尝试添加一行时。
我使用更改了表的名称db_table
(因此它将在管理页面上将 Postss 更改为 Posts)并向__str__
函数添加了一个输出,我尝试了str函数的一些输出变体,但它们都不起作用。我什至试图评论它。还是。表名或错误没有变化。我尝试更改我的str函数几次并得到相同的结果。删除str函数时,我仍然得到相同的结果。
我对这种情况有一些疯狂的猜测:
- 由于某种原因,它可能不适用于抽象用户类,并且不知道如何解决这个问题以及为什么会发生这种情况。(删除该
author=...
行可以解决此问题,但不会更改表名,但我确实需要用户 fk )。 Python 3.9.1
由于我的环境或 python 版本(?),它可能无法正确迁移。
- PS:我所做的每一项更改都包括停止服务器运行和运行以下行:
python manage.py migrate
和python manage.py makemigrations
.
帖子/模型.py:
from django.db import models
from users.models import Users
class Posts(models.Model):
content = models.TextField(max_length=255)
author = models.ForeignKey('users.Users', on_delete=models.CASCADE, null=True)
timestamp = models.DateTimeField(auto_now_add=True, null=True)
class Meta:
db_table = 'Posts'
def __str__(self):
return self.content + " " + self.author.email + " " + self.timestamp
我也会添加我的用户模型:
from django.db import models
from django.contrib.auth.models import AbstractUser
# https://rahmanfadhil.com/django-login-with-email/
class Users(AbstractUser):
USERNAME_FIELD = 'email'
email = models.EmailField(unique=True)
REQUIRED_FIELDS = ['username'] # removes email from REQUIRED_FIELDS
def __str__(self):
return (self.email, self.username)
解决方案
您正在尝试返回 a tuple
,它必须是 a string
。
def str (self): return (self.email, self.username)
在Python中使用新式格式
试试这个:
class Users(AbstractUser):
...
def __str__(self):
template = '{0.email} {0.username}'
return template.format(self)
class Posts(models.Model):
...
def __str__(self):
template = '{0.content} {0.author.email} {0.timestamp}'
return template.format(self)
或者
def __str__(self):
return '{} {} {}'.format(self.content, self.author.email, self.timestamp)
第二个问题:
如果我正确理解您的问题,那么要更改模型的标签,您需要使用verbose_name
:
class Meta:
verbose_name = 'Post'
verbose_name_plural = 'Posts'
使用选项db_table您可以更改要用于模型的数据库表的名称。
并查看 Django 的解释它是如何工作的:如果你有一个应用程序bookstore
(由 创建manage.py startapp bookstore
),定义为的模型class Book
将有一个名为 的数据库表bookstore_book
。
那么db_table
必须是:
class Meta:
# your desired table name can you find in your database
db_table = 'appLabel_modelName'
要列出PostgreSQL的当前数据库中的表,您可以运行:
python manage.py dbshell
\dt
另请参阅 Django db_table
推荐阅读
- java - ColumnConstraints.setPercentWidth() 在使用数组时不起作用
- python - 对 linux box 提供的 Django 应用程序使用 Windows 身份验证
- node.js - 如何连接到 localhost PostgreSQL 数据库?
- javascript - mongo 查询中的多个 $unwind 和 $group
- python - Pandas:按列和行对数据集进行分组
- javascript - Laravel - 在服务器上返回 405 GET 方法不允许
- javascript - 使用 Cube.js 进行外部连接
- rstudio - “警告:read.xlsx.default 中的错误:文件不存在。” 在我的本地机器上工作正常,部署时失败
- ruby - Rspec 字符串截断的最佳解决方法是什么?
- algorithm - 证明归并排序输出输入的排列