django typeerror:id()只接受一个参数(给定0)

kcugc4gi  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(324)

因此,我一直在尝试实现一种方法,上传多个图像到一个职位。我的做法是有table。一个是真实的帖子,一个是上传的多张图片。我本来打算用外键把它们连接起来,但没用。我的终端开始抛出错误“typeerror:id()只接受一个参数(给定0)”。每当我迁移它时,它就会抛出这个错误。
我不知道怎么解决这个问题。
我的代码:
型号.py

from django.db import models
from django.utils import timezone
from django.forms import ModelForm
from django.utils.text import slugify
from django.utils.crypto import get_random_string
from django.conf import settings

from PIL import Image

import os

DEFAULT_IMAGE_ID = 1

# Create your models here.

class Projects(models.Model):
    title = models.CharField(max_length=30)
    description = models.TextField(max_length=150)
    publish_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True, auto_now_add=False)
    slug = models.SlugField(unique=True)
    files = models.FileField(upload_to='files/', blank=True)
    images = models.ImageField(upload_to='images/', height_field = 'img_height', width_field = 'img_width',blank=True)
    img_height = models.PositiveIntegerField(default=600)
    img_width = models.PositiveIntegerField(default=300)
    #feature_images = models.ForeignKey(P_Images, on_delete=models.CASCADE, default=DEFAULT_IMAGE_ID)
    feature_images = models.AutoField(primary_key=True)

    def __str__(self):
        return self.title

    def save(self, *args,**kwargs):
        # Generates a random string 
        unique_string = get_random_string(length=32)

        # Combines title and unique string to slugify
        slugtext = self.title + "-" + "unique_id=-" + unique_string
        self.slug = slugify(slugtext)

        return super(Projects, self).save(*args,**kwargs)

class P_Images(models.Model):
    p_file = models.ImageField(upload_to='images/', blank=None)
    p_uploaded_at = models.DateTimeField(auto_now_add=True, auto_now=False)
    #fk_post = models
    fk_post = models.ForeignKey(Projects, on_delete=models.CASCADE)

错误日志

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, projects, sessions
Running migrations:
  Applying projects.0005_auto_20180823_0553...Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args,**cmd_options)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args,**options)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 200, in handle
    fake_initial=fake_initial,
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/migrations/migration.py", line 122, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 216, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 525, in alter_field
    old_db_params, new_db_params, strict)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 630, in _alter_field
    new_default = self.effective_default(new_field)
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 218, in effective_default
    default = field.get_default()
  File "/home/erichardson/env01/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 775, in get_default
    return self._get_default()
TypeError: id() takes exactly one argument (0 given)

我使用一个mysql数据库。这个错误是在我更新了我的表以便能够相互链接之后出现的。我计划p\u图像的fk\u post包含外键的项目的feature\u图像值。
005吨/年

import builtins
from django.db import migrations, models
import django.db.models.deletion

class Migration(migrations.Migration):

    dependencies = [
        ('projects', '0004_auto_20180823_0547'),
    ]

    operations = [
        migrations.AlterField(
            model_name='p_images',
            name='fk_post',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Projects'),
        ),
        migrations.AlterField(
            model_name='projects',
            name='feature_images',
            field=models.IntegerField(default=builtins.id),
        ),
    ]

如果migration.py告诉你什么或什么,请告诉我。

svmlkihl

svmlkihl1#

我认为发生此错误是因为您没有为外键设置默认值。对于以前的p\u images示例(在当前迁移之前),它们没有与之相关的projects id。显示的错误文本也证实了这一点:

return self._get_default()
TypeError: id() takes exactly one argument (0 given)

因此,请尝试添加默认值:

DEFAULT_PROJECT = 1 # or the id of any project that does exist
fk_post = models.ForeignKey(Projects, on_delete=models.CASCADE, default = DEFAULT_PROJECT)
2fjabf4q

2fjabf4q2#

你的迁移过程中有一些非常奇怪的东西:

models.IntegerField(default=builtins.id)

这是指内置的 id 函数,它需要一个参数,因为它返回python中对象的内部id。它与数据库ID无关,根本不属于这里。我只能猜测,在创建迁移时,有人要求您输入默认值,而您只是输入了 id .
您应该从迁移中删除该默认值,但这可能会使其无法执行。您也可以尝试默认值 0 ,这是有道理的;但是您的实际模型代码将该字段显示为主键,因此您可能需要进行另一次后续迁移,再次更改该字段;0不能作为pk。
如果您仍处于开发阶段,并且没有任何需要保留的数据,我建议您完全删除数据库和迁移,然后重新开始makemigrations。

相关问题