Python 更改Django上的db#U表不会';迁移后无法工作,添加用户(AbstractUser)外键会中断

Python 更改Django上的db#U表不会';迁移后无法工作,添加用户(AbstractUser)外键会中断,python,django,django-models,django-admin,django-migrations,Python,Django,Django Models,Django Admin,Django Migrations,这是一个有2个问题的帖子,我怀疑它们之间有某种联系。 Django上的我的posts应用程序没有正确迁移(我认为),添加“作者”(用户抽象用户模型)会破坏我的代码,错误如下: str返回的非字符串(类型为tuple) 每当我尝试添加一行时 我使用db\u table更改了表的名称(因此它会将Postss更改为admin页面上的Posts),并向\uuuu str\uuu函数添加了一个输出,我尝试了str函数的一些输出变体,但没有一个有效。我甚至试着把它说出来。而且还是。表名或错误没有更改。我尝试

这是一个有2个问题的帖子,我怀疑它们之间有某种联系。 Django上的我的posts应用程序没有正确迁移(我认为),添加“作者”(用户抽象用户模型)会破坏我的代码,错误如下:

str返回的非字符串(类型为tuple)

每当我尝试添加一行时

我使用
db\u table
更改了表的名称(因此它会将Postss更改为admin页面上的Posts),并向
\uuuu str\uuu
函数添加了一个输出,我尝试了str函数的一些输出变体,但没有一个有效。我甚至试着把它说出来。而且还是。表名或错误没有更改。我尝试了几次更改我的str函数,得到了相同的结果。当删除str函数时,我仍然得到相同的结果

我对这种情况有一些疯狂的猜测:

  • 出于某种原因,它可能无法与抽象用户类一起工作,并且不知道如何解决这个问题以及为什么会发生这种情况。(删除
    author=…
    行可以解决此问题,但不会更改表名,但我确实需要用户fk)
  • 由于我的环境或python版本
    python 3.9.1
    (?),它可能无法正确迁移
  • PS:我所做的每一个更改都包括停止服务器运行和运行以下行:
    python manage.py migrate
    python manage.py makemigrations
posts/models.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)

尝试将您的
\uuu str\uu
方法更改为:

def __str__(self):
        return self.content + " " + str(self.author.email) + " " + str(self.timestamp)

另外,您只需要在更改了模型而不是模型方法

时进行迁移。如果您试图返回一个
元组
,它必须是一个
字符串

defstr(自我): 返回(self.email、self.username)

使用中的新样式格式

请尝试以下方法:

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)

第二个问题:

如果我正确理解了您的问题,那么要更改模型的标签,您需要使用
verbose\u name

class Meta:
    verbose_name = 'Post'
    verbose_name_plural = 'Posts'

使用选项,您可以更改要用于模型的数据库表的名称

请参见Django的解释:如果您有一个应用程序
bookstore
(由
manage.py startapp bookstore
创建),则定义为
class Book
的模型将有一个名为
bookstore\u Book
的数据库表

那么
db_表
必须是:

class Meta:
    # your desired table name can you find in your database
    db_table = 'appLabel_modelName'
要列出当前数据库中PostgreSQL的表,可以运行:

python manage.py dbshell

\dt

另请参见Django

Hi SLDem。好啊很高兴知道。无论如何,这不起作用。我粘贴了一个错误的屏幕截图,以使我的问题更清楚。您的
用户
模型伴侣上实际上没有
用户名
字段,这可能是
用户
方法中的问题?我有,因为它是默认用户类的类扩展(使用AbstractUser类)我刚刚将其更改为使用电子邮件作为主要标识符,而不是用户名。您的模型用户
\uuuu str\uuuu
返回
元组
,但它必须是
字符串
。我更新了我的答案。是的,这很有效!我不知道这样做仍然使用用户的str函数。但是我的表名没有得到
db\u table='Posts'
的值。为什么?@W.Doch,如果我正确理解了你的第二个问题,那么要更改模型的标签,你需要使用详细的名称。我更新了我的答案。所以我发现我要找的是
verbose\u name\u plural=“Posts”
,而不是
db\u table
。。。django对我来说仍然很奇怪。谢谢你,伙计。@W.Doch,很高兴能帮上忙啊,我看到你编辑了你的帖子;)!
python manage.py dbshell

\dt