So I have been trying to implement a way to upload multiple images to a post. The way I did it is to have tables. One for the actual post, and one of the multiple images uploaded. I was planning to link them with a foreign key but it is not working. My terminal started throwing the error “TypeError: id() takes exactly one argument (0 given)” . It throws me this error whenever I migrate it.
I am not sure how to fix this.
MY code:
models.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)
The errorlog
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)
I use a MySQL database for this. This error started popping up after I updated my tables to be able to link with each other. I plan the fk_post of the P_Images to contain the feature_image value of Projects for the foreign key.
005_migration.py
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), ), ]
please let me know if the migration.py tells you something or nothing.
Advertisement
Answer
You have something very bizarre in your migration:
models.IntegerField(default=builtins.id)
This is referring to the builtin id
function, which requires an argument because it returns the internal ID of an object in Python. It has nothing to do with database IDs, and doesn’t belong here at all. I can only guess that you were asked for a default when creating the migration and you just typed in id
.
You should delete that default from the migration, but that may make it unable to execute. You could also try a default of 0
, which makes sense there; but your actual models code shows that field as the primary key, so you presumably have another subsequent migration that changes the field again; and 0 wouldn’t work as a pk.
If you’re still in development and don’t have any data you need to keep, I would suggest deleting your database and migrations completely and starting again with makemigrations.