首页 > 解决方案 > 迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()

问题描述

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

str返回非字符串(类型元组)

每当我尝试添加一行时。

我使用更改了表的名称db_table(因此它将在管理页面上将 Postss 更改为 Posts)并向__str__函数添加了一个输出,我尝试了str函数的一些输出变体,但它们都不起作用。我什至试图评论它。还是。表名或错误没有变化。我尝试更改我的str函数几次并得到相同的结果。删除str函数时,我仍然得到相同的结果。

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

帖子/模型.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)

在此处输入图像描述

标签: pythondjangodjango-modelsdjango-admindjango-migrations

解决方案


您正在尝试返回 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


推荐阅读