django
  • django-models
  • manytomanyfield
  • 2010-10-02 12 views 5 likes 
    5

    Mam dwa modele, które mają w jakiś sposób związek z tabelą "przelotową"?Czy mogę dodać menedżera do wielostronnego związku?

    class Bike(models.Model): 
        nickname = models.CharField(max_length=40) 
        users = models.ManyToManyField(User, through='bike.BikeUser') 
    

    Klasa BikeUser

    class BikeUser(models.Model): 
        bike  = models.ForeignKey(Bike) 
        user  = models.ForeignKey(User) 
        comment = models.CharField(max_length=140) 
    

    chciałbym dodać funkcję do klasy rower do pracy z użytkownikami, czy istnieje praktyka sposób to zrobić najlepiej. Chciałbym unikać dodawania zbyt wiele metod do klasy rower i raczej mieć jakiś kierownika do pracy przez

    coś takiego:

    bike.bikeusers_set.commonMethod() 
    

    lub

    bike.bikeusers.commonMethod() 
    

    Jaki byłby najlepszy sposób to osiągnąć?

    Odpowiedz

    6

    Po utworzeniu modelu BikeUser można dodać niestandardowego menedżera do modelu.

    Coś jak:

    class BikeUserManager(models.Manager): 
        def commonMethod(): 
         pass 
    
    class BikeUser(models.Model): 
        bike  = models.ForeignKey(Bike) 
        user  = models.ForeignKey(User) 
        comment = models.CharField(max_length=140) 
        objects = BikeUserManager() 
    

    Ale można używać tylko go od BikeUser Model:

    BikeUser.objects.commonMethod() 
    

    Co chcesz jest użycie tego menedżera jako powiązany kierownika: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

    Dodaj use_for_related_fields=True do klasy menedżera.

    class MyManager(models.Manager): 
        use_for_related_fields = True 
    
    +0

    Dziękuję, to działało jak czar! Howerver, jeśli zadzwonię do menedżera z zainstalowanego roweru bike.bikeuser_set.commonMethod() Jak uzyskać dostęp do "roweru" z serwisu commonMethod? (czy to jest nowe pytanie?) – Joelbitar

    +0

    Myślę, że będziesz musiał dodać go jako parametr funkcji: def commonMethod (self, bike) i użyj go w ten sposób: bike.bikeuser_set.commonMethod (bike) – OmerGertel

    +0

    That is what I I "Robiłem, myślałem, że był lepszy sposób, i tak bardzo dziękuję! – Joelbitar

    Powiązane problemy