【问题标题】:Error while adding data using Django Administration's panel使用 Django 管理面板添加数据时出错
【发布时间】:2019-01-27 03:13:21
【问题描述】:

我目前正在试验 Django 框架,并且我制作了一个包含 2 个模型的应用程序。第一个是用户模型,其中包含用户和一些关于他们的基本信息。第二个模型是 Image 模型,它有一个作者(用外键链接用户模型)和一个文件名。

应用名称:Sc

模型:用户、图像

我的模型的代码:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=128, default='')
    password = models.CharField(max_length=512, default='')
    ip_address = models.CharField(max_length=32, default='')

    def __str__(self):
        return f"{self.id} - {self.username}"

class Image(models.Model):
    author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    filename = models.CharField(max_length=512)

    def __str__(self):
        return f"{User.objects.filter(id=self.author)} - {self.filename}"

我可以使用 Django 的管理面板 (localhost/admin) 添加用户,但是我无法添加任何图像。

我选择了我想要的用户作为图像的作者,并添加了一个随机文件名,但是当我尝试添加新图像时出现以下错误:

TypeError at /adminsc/image/add/
int() argument must be a string, a bytes-like object or a number, not 'User'
Request Method: POST
Request URL: http://localhost/adminsc/image/add/
Django Version: 2.0.7
Exception Type: TypeError
Exception Value:
int() argument must be a string, a bytes-like object or a number, not 'User'
Exception Location: C:\Python37\lib\site-packages\django\db\models\fields__init__.py in get_prep_value, line 947
Python Executable: C:\Python37\python.exe
Python Version: 3.7.0
Python Path:
['G:\smiley\Websites\local',
'C:\Python37\python37.zip',
'C:\Python37\DLLs',
'C:\Python37\lib',
'C:\Python37',
'C:\Python37\lib\site-packages']
Server time: Tue, 21 Aug 2018 00:05:30 +0000

我已经尝试删除包括迁移文件夹在内的数据库并从头开始重新启动,但我总是遇到同样的错误。它似乎在实际期望其主键时尝试传递用户对象。使用 ForeignKey(User) 作为 Image 的属性/列,我做错了吗?

【问题讨论】:

  • 在重命名内置 User 模型时可能会遇到一些问题。另外,你看过models.ImageField吗? docs.djangoproject.com/en/2.1/ref/models/fields/#imagefield
  • 所以我将我的“用户”模型重命名为“BananaMan”,我删除并重新创建了数据库,但它仍然给我同样的错误。也感谢图像字段信息,我会调查的:)

标签: python django django-models django-admin django-admin-actions


【解决方案1】:

错误信息说明了一切:

int() argument must be a string, a bytes-like object or a number, not 'User'

您正在传递一个 User 对象以在 .filter() 调用中用作 id,这是无效的。

这里有多个问题:

  1. 你应该使用{User.objects.filter(id=self.author.id)}
  2. 不会返回一个User 对象(因为filter() 调用),而是一个大小为1 的Users 列表。您可能应该将其更改为{User.objects.get(id=self.author.id)}
  3. 上述方法可行,但没有意义,因为这是获取{self.author} 的昂贵方式:

    return f"{self.author) - {self.filename}"

【讨论】:

    最近更新 更多