Je rencontre des problèmes lors de la suppression d'un utilisateur (uniquement pour les tests) et je ne suis pas sûr de ce qui se passe. Je cours python 3.6 et Django 1.11.6. Mes tests n'utilisent pas les migrations de base de données, ils créent la base de données directement à partir du modèle, mais la même chose se produit lorsque j'essaie de supprimer une entrée existante de la base de données normale correctement migrée.Django FieldError lors de la tentative de suppression de l'utilisateur
d'abord créer un utilisateur:
user = User.objects.create_user('testing', '[email protected]', 'testpass')
Et j'appelle simplement:
user.delete()
Et il se bloque dans la méthode de suppression(). L'utilisateur n'a même pas besoin d'ajouter une UserImage associée, et il se bloque toujours. Initialement, je pensais que cela est dû à l'objet associé, car l'exception dit "join on" ajouté "n'est pas autorisé", et "added" est un champ sur UserImage. Toute aide est appréciée comme je regarde pendant des heures et ne peut pas trouver la cause :(
models.py
class UserManager(BaseUserManager):
def _create_user(self, username, email, password, **extra_fields):
if not username:
raise ValueError('Username must be set.')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, username, email=None, password=None, **extra_fields):
return self._create_user(username, email, password, **extra_fields)
class User(AbstractBaseUser):
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
USERNAME_ALLOWED_REGEX = r'\w._-'
objects = UserManager()
username = models.CharField(
db_index=True,
max_length=10, unique=True,
help_text=_('10 characters or fewer. Letters, digits and ._- only.'),
validators=[
validators.RegexValidator(r'^[' + USERNAME_ALLOWED_REGEX + r']+$', _('Enter a valid username.'), 'invalid')
],
)
first_name = models.CharField(
max_length=30, blank=True,
help_text=_('Maximum 30 characters.'),
)
last_name = models.CharField(
max_length=30, blank=True,
help_text=_('Maximum 30 characters.'),
)
email = models.EmailField(
unique=True,
)
is_active = models.BooleanField(
default=True,
)
joined = models.DateTimeField(
auto_now_add=True, editable=False,
)
avatar = models.OneToOneField(
'UserImage',
null=True, blank=True, related_name='avatar_user',
on_delete=models.SET_NULL,
)
def add_image(self, name, content, save=True):
new_image = UserImage(user=self)
new_image.save_images(name, content, save=save)
return new_image
class UserImage(models.Model):
class Meta:
verbose_name = _('user_image')
verbose_name_plural = _('user_images')
ordering = 'id',
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='images',
on_delete=models.CASCADE,
)
added = models.DateTimeField(
auto_now_add=True, editable=False,
)
image = RenamedProcessedImageField(
upload_to=user_image_path,
processors=(ResizeToFit(2048, 2048, upscale=False),),
format='JPEG',
options={'quality': 100},
)
def save_images(self, name, content, save=True):
self.image.save(name, content, save=False)
if save:
self.full_clean(validate_unique=False)
self.save()
Exception:
Traceback (most recent call last):
File "***/users/tests.py", line 237, in test_files_on_delete_rule
user.delete()
File "***/python3.6/site-packages/django/db/models/base.py", line 973, in delete
collector.collect([self], keep_parents=keep_parents)
File "***/python3.6/site-packages/django/db/models/deletion.py", line 222, in collect
elif sub_objs:
File "***/python3.6/site-packages/django/db/models/query.py", line 254, in __bool__
self._fetch_all()
File "***/python3.6/site-packages/django/db/models/query.py", line 1118, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "***/python3.6/site-packages/django/db/models/query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 871, in execute_sql
sql, params = self.as_sql()
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 423, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup()
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 47, in pre_sql_setup
order_by = self.get_order_by()
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 298, in get_order_by
field, self.query.get_meta(), default_order=asc))
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 601, in find_ordering_name
field, targets, alias, joins, path, opts = self._setup_joins(pieces, opts, alias)
File "***/python3.6/site-packages/django/db/models/sql/compiler.py", line 634, in _setup_joins
pieces, opts, alias)
File "***/python3.6/site-packages/django/db/models/sql/query.py", line 1417, in setup_joins
names, opts, allow_many, fail_on_missing=True)
File "***/python3.6/site-packages/django/db/models/sql/query.py", line 1385, in names_to_path
" not permitted." % (names[pos + 1], name))
django.core.exceptions.FieldError: Cannot resolve keyword 'max' into field. Join on 'added' not permitted.
Vous avez terminé toutes les migrations? Si vous avez essayé de supprimer complètement le FK de l'image de l'utilisateur, cela fonctionnerait-il alors? – Jonathan
@Jonathan Oui, je l'ai aussi essayé après avoir fait les migrations à partir de zéro. J'ai juste essayé, je reçois toujours la même erreur. – Kukosk
Je suis beaucoup plus proche du problème en ce moment, j'ai essayé de supprimer toutes les relations de modèle avec la classe User, et ça a fonctionné, donc je les ai replacées et j'ai essayé de trouver qui cause le problème. le causer, et je sais probablement même pourquoi. – Kukosk