2017-10-20 32 views
0

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. 
+0

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

+0

@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

+0

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

Répondre

0

Ok, donc j'ai découvert que le problème était en fait causé par la définition de la commande sur mon modèle Topic:

class ForumTopic(models.Model): 
    class Meta: 
     ordering = '-forum_posts__added__max', 

Il fonctionne quand je le supprimer, ou modifier à:

class ForumTopic(models.Model): 
    class Meta: 
     ordering = '-id',