Partage
  • Partager sur Facebook
  • Partager sur Twitter

Django - héritage

Anonyme
    21 janvier 2015 à 21:47:28

    Bonjour, 

    J'ai un gros problème en voulant faire de l'héritage classique :

    Mon models.py:
    class Scribe(models.Model):
    	user = models.OneToOneField(User)
    	
    	def __str__(self):
    		return "{ "+self.user.username+" } "
    
    
    class membre(Scribe): 
    	def __str__(self):
    		return "{ "+self.user.username+" } "



    Dans le shell je fais ça :

    • u=User.objects.create_user(username="lala")
    • s=Scribe(u)
    • m=membre(s)

    Mais j'ai une erreur quand je fais ça : m or m.user.username I have this error :

    Erreur : RelatedObjectDoesNotExist : Scribe has no user

    Le problème vient du OneToOneField car quand je l'enlève ça marche

     

     PS : Je ne cherche pas à faire du proxy mais bien de l'héritage classique

    -
    Edité par Anonyme 21 janvier 2015 à 22:21:47

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2015 à 22:59:49

      Ton problème vient de la façon dont tu instancies tes objets, il te faudrait faire simplement:

      s = Scribe(user=u)
      

      Et ensuite, pour passer d'un Scribe à un membre, je crois que le plus simple est de repasser par l'id:

      m = member.objects.get(pk=s.pk)
      
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        21 janvier 2015 à 23:19:51

        J'ai testé ça et j'ai une AUTRE erreur :

        <ipython-input-4-3a0908a7e375> in <module>()
        ----> 1 m = member.objects.get(pk=s.pk)
        
        /usr/local/lib/python2.7/dist-packages/django/db/models/manager.pyc in manager_method(self, *args, **kwargs)
             90         def create_method(name, method):
             91             def manager_method(self, *args, **kwargs):
        ---> 92                 return getattr(self.get_queryset(), name)(*args, **kwargs)
             93             manager_method.__name__ = method.__name__
             94             manager_method.__doc__ = method.__doc__
        
        /usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in get(self, *args, **kwargs)
            355             raise self.model.DoesNotExist(
            356                 "%s matching query does not exist." %
        --> 357                 self.model._meta.object_name)
            358         raise self.model.MultipleObjectsReturned(
            359             "get() returned more than one %s -- it returned %s!" % (
        
        DoesNotExist: member matching query does not exist. 

        DoesNotExist: MembreProjet matching query does not exist.

        -
        Edité par Anonyme 21 janvier 2015 à 23:22:49

        • Partager sur Facebook
        • Partager sur Twitter
          22 janvier 2015 à 0:12:59

          Avant de pouvoir le récupérer, il faut que ton objet s existe en base, et donc que tu l'aies préalablement enregistré (s.save()). L'exemple que j'ai donné est pour le cas où tu as un Scribe existant et que tu veux en récupérer le member. Si tu n'as pas de Scribe, autant instancier directement un member:

          m  = member(user=u)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            22 janvier 2015 à 18:55:50

            Même en sauvegardant, j'ai la même erreur...

            L'erreur vient du OneToOneField j'en suis sur, mais je ne sais pas pourquoi..

            member est une extension de Scribe, c'est à dire que une instance de member aura les mêmes attribut qu'une instance de Scribe, mais avec + de parametres spéécifique à member...

            • Partager sur Facebook
            • Partager sur Twitter

            Django - héritage

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown