#33307: Model got both positional and keyword arguments for field 'id'.
-------------------------------+--------------------------------------
Reporter: אורי | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Description changed by אורי:
Old description:
> 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',)
> }}}
New description:
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)
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/33307#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/069.70a45dbde36aa57062d509b48dcab00b%40djangoproject.com.