Opened 4 years ago
Last modified 4 years ago
#33307 closed Uncategorized
Model got both positional and keyword arguments for field 'id'. — at Version 1
| Reported by: | אורי | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 4.0 |
| Severity: | Normal | Keywords: | |
| Cc: | אורי | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hi, I got failed tests with Django==4.0rc1 and I suspect this is related to Django. The tests pass with Django==3.2.9.
Here is one of the failed tests (on Windows, with Python 3.8):
======================================================================
ERROR: test_user_can_read_chat_with_a_blocker (speedy.core.messages.tests.test_views.ChatDetailViewTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "speedy\core\messages\tests\test_views.py", line 78, in test_user_can_read_chat_with_a_blocker
self.client.login(username=self.user_1.slug, password=tests_settings.USER_PASSWORD)
File ".venv_3.8\lib\site-packages\django\test\client.py", line 604, in login
user = authenticate(**credentials)
File ".venv_3.8\lib\site-packages\django\views\decorators\debug.py", line 42, in sensitive_variables_wrapper
return func(*func_args, **func_kwargs)
File ".venv_3.8\lib\site-packages\django\contrib\auth\__init__.py", line 76, in authenticate
user = backend.authenticate(request, **credentials)
File ".venv_3.8\lib\site-packages\django\contrib\auth\backends.py", line 42, in authenticate
user = UserModel._default_manager.get_by_natural_key(username)
File "speedy\core\accounts\managers.py", line 37, in get_by_natural_key
return self.distinct().get(Q(username=normalize_username(username=username)) | Q(email_addresses__email=username))
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 435, in get
num = len(clone)
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 262, in __len__
self._fetch_all()
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 1356, in _fetch_all
self._prefetch_related_objects()
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 841, in _prefetch_related_objects
prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups)
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 1760, in prefetch_related_objects
obj_list, additional_lookups = prefetch_one_level(
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 1902, in prefetch_one_level
all_related_objects = list(rel_qs)
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 280, in __iter__
self._fetch_all()
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 1354, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File ".venv_3.8\lib\site-packages\django\db\models\query.py", line 69, in __iter__
obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
File ".venv_3.8\lib\site-packages\django\db\models\base.py", line 519, in from_db
new = cls(*values)
File "speedy\core\uploads\models.py", line 31, in __init__
super().__init__(*args, **kwargs)
File ".venv_3.8\lib\site-packages\django\db\models\base.py", line 446, in __init__
raise TypeError(
TypeError: Image() got both positional and keyword arguments for field 'id'.
======================================================================
Our repository is open source at https://github.com/speedy-net/speedy-net
This might be related to our models:
import os
from django.db import models
from django.utils.translation import gettext_lazy as _
from speedy.core.base.models import TimeStampedModel
from speedy.core.base.fields import RegularUDIDField
from speedy.core.base.utils import generate_regular_udid
from .utils import uuid_dir
class File(TimeStampedModel):
id = RegularUDIDField()
owner = models.ForeignKey(to='accounts.Entity', verbose_name=_('owner'), on_delete=models.SET_NULL, blank=True, null=True)
file = models.FileField(verbose_name=_('file'), upload_to=uuid_dir)
is_stored = models.BooleanField(verbose_name=_('is stored'), default=False)
size = models.PositiveIntegerField(verbose_name=_('file size'), default=0)
@property
def basename(self):
return os.path.basename(self.file.name)
class Meta:
verbose_name = _('file')
verbose_name_plural = _('uploaded files')
ordering = ('-date_created',)
def __init__(self, *args, **kwargs):
if (not (kwargs.get('id'))):
kwargs['id'] = generate_regular_udid()
super().__init__(*args, **kwargs)
def __str__(self):
return '{} (owner={})'.format(self.basename, self.owner)
def save(self, *args, **kwargs):
self.size = self.file.size
return super().save(*args, **kwargs)
def store(self):
self.is_stored = True
self.save(update_fields={'is_stored', 'size'})
class Image(File):
visible_on_website = models.BooleanField(verbose_name=_('visible on website'), default=False)
aws_image_moderation_time = models.DateTimeField(verbose_name=_('AWS image moderation time'), blank=True, null=True)
aws_facial_analysis_time = models.DateTimeField(verbose_name=_('AWS facial analysis time'), blank=True, null=True)
aws_raw_image_moderation_results = models.JSONField(verbose_name=_('AWS raw image moderation results'), blank=True, null=True)
aws_raw_facial_analysis_results = models.JSONField(verbose_name=_('AWS raw facial analysis results'), blank=True, null=True)
number_of_faces = models.PositiveSmallIntegerField(verbose_name=_('number of faces'), blank=True, null=True)
class Meta:
verbose_name = _('images')
verbose_name_plural = _('uploaded images')
ordering = ('-date_created',)
from django.conf import settings as django_settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from .utils import generate_regular_udid, generate_small_udid
from . import validators as speedy_core_base_validators
# Never use this class directly. Only use inherited classes below.
class UDIDField(models.CharField):
class Meta:
abstract = True
def __init__(self, *args, **kwargs):
given_kwargs = kwargs
defaults = {
'verbose_name': _('ID'),
'primary_key': True,
'db_index': True,
'unique': True,
}
kwargs = defaults
kwargs.update(given_kwargs)
super().__init__(*args, **kwargs)
class SmallUDIDField(UDIDField):
id_generator = staticmethod(generate_small_udid)
def __init__(self, *args, **kwargs):
given_kwargs = kwargs
defaults = {
'max_length': django_settings.SMALL_UDID_LENGTH,
'validators': [speedy_core_base_validators.small_udid_validator],
}
kwargs = defaults
kwargs.update(given_kwargs)
super().__init__(*args, **kwargs)
class RegularUDIDField(UDIDField):
id_generator = staticmethod(generate_regular_udid)
def __init__(self, *args, **kwargs):
given_kwargs = kwargs
defaults = {
'max_length': django_settings.REGULAR_UDID_LENGTH,
'validators': [speedy_core_base_validators.regular_udid_validator],
}
kwargs = defaults
kwargs.update(given_kwargs)
super().__init__(*args, **kwargs)
Note:
See TracTickets
for help on using tickets.