当我导航到此模型贷款的管理页面或通用视图时,我收到以下错误:

File "library_app/catalog/models.py", line 118, in __str__
return f'{self.book.title} ({self.id})'
AttributeError: 'NoneType' object has no attribute 'title'

我设法找到了我的BookInstance类的__str__函数.

class Loan(models.Model):
book_instance = models.OneToOneField(BookInstance, on_delete=models.RESTRICT)
user = models.ForeignKey(User, on_delete=models.RESTRICT)
date = models.DateField(
    default=django_timezone.now,
    help_text='Date borrowed'
)
due_back = models.DateField(
    default= django_timezone.now() + datetime.timedelta(30), 
    help_text='Date due to be returned'
)
returned_date = models.DateField(null=True, blank=True, help_text='Date book was returned')



class BookInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
book = models.ForeignKey(Book, on_delete=models.RESTRICT, null=True)

LOAN_STATUS = (
    ('m', 'Maintence'),
    ('o', 'On loan'),
    ('a', 'Available'),
    ('r', 'Reserved'),
)

status = models.CharField(
    max_length=1,
    choices=LOAN_STATUS,
    blank=True,
    default='m',
    help_text='Book Availability'
)

def __str__(self):
    return f'{self.book.title} ({self.id})'

我猜在这些页面中,当__str__方法被调用时,使用的是错误的self变量.我不知道如何解决这个问题,所以任何提示都将不胜感激.

推荐答案

书中有null=True,所以self.book可以是None,因此self.book.title本身等于not是有意义的.

因此,在__str__中,您必须首先判断该对象是否确实存在链接的book,因此:

class BookInstance(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    book = models.ForeignKey(Book, on_delete=models.RESTRICT, null=True)
    LOAN_STATUS = (
        ('m', 'Maintence'),
        ('o', 'On loan'),
        ('a', 'Available'),
        ('r', 'Reserved'),
    )

    status = models.CharField(
        max_length=1,
        choices=LOAN_STATUS,
        blank=True,
        default='m',
        help_text='Book Availability',
    )

    def __str__(self):
        if self.book_id:
            return f'{self.book.title} ({self.id})'
        return str(self.id)

然而,将其设为null=True有点奇怪,这意味着可以有BookInstance而没有相关的Book?更好的方法可能是清理数据库,从而查找具有book=NoneBookInstance,修复它们,并将该字段标记为不可为空.

Python-3.x相关问答推荐

如何将CSV或FDF数据解析到Python词典并注入到模板PDF表单中?

Paramiko SFTPClient get()和put()函数的通过/失败结果?

Pandas :从元组字典创建数据帧

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

如何从包含SPAN文本的标记中获取链接

继承自 Counter 与 dict 的类实例的 Deepcopy

使用Python按照其组/ID的紧密值的递增顺序映射数据框的两列

Pandas 窗口聚合两个排序表

如何在 on_ready 事件中使用 change_presence? (discord.py)

在判断列表变量时如何判断特定列的值并分配加权整数值

在 Python 3.5 中使用 aiohttp 获取多个 url

为什么中断比引发异常更快?

Python 3.5:async with导致 SyntaxError.为什么?

try 在 Windows 10 高 DPI 显示器上解决模糊的 tkinter 文本 + zoom ,但担心我的方法不是 Pythonic 或不安全

在 Python 3 中调用 super() 的 4 种方法中的哪一种?

什么是ANSI_X3.4-1968编码?

在动态链接库 Anaconda3\Library\bin\mkl_intel_thread.dll 中找不到序数 242

如何将python日志(log)级别名称转换为整数代码

在 Visual Studio Code 中调试 Scrapy 项目