2009-09-07 8 views
8

Mam nietypowy problem. Rozważmy takie modele (podjęte od docs django):Domyślne zamówienie dla elementów m2m według pola modelu pośredniego w Django

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

Teraz, powiedzmy, że mamy 2 Beatles członków OUT zespołu The Beatles (na przykładzie w docs Django dla modeli pośrednich):

>>> beatles.members.all() 
[<Person: Ringo Starr>, <Person: Paul McCartney>] 

Powyższy kod zwróci członków posortowanych według domyślnego zamówienia dla modelu osoby. Jeśli podam:

>>> beatles.members.all().order_by('membership__date_joined') 

członków, są sortowane według daty połączenia. Czy mogę w jakiś sposób ustawić to zachowanie domyślne dla tego pola ManyToMany? To jest ustawienie domyślnej kolejności powiązanych elementów według pól w modelu pośrednim? Wydaje się, że ManyRelatedManager ma argument init core_filters, ale nie mam pojęcia, jak uzyskać do niego dostęp, podając podklasę całego pola m2m w django. Wszelkie kreatywne pomysły? :)

góry dzięki :)

Mam otworzył ticket in django trac.

Odpowiedz

4

Oto metoda dirty-Hack do osiągnięcia tego celu (patrzeć na modelu Group):

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    _members = models.ManyToManyField(Person, through='Membership') 
    @property 
    def members(self): 
     return self._members.order_by('membership__date_joined') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

nie przeszkadzało, aby utworzyć zestaw dekorator nieruchomości, ale powinno być dość łatwo naśladować ustawienie oryginalnego pola. Brzydkie obejście, ale wydaje się, że to wystarczy.

+0

ta metoda zwraca więcej rekordów niż oczekiwano dla mnie. kończy się tworzenie ZEWNĘTRZNEGO POŁĄCZENIA LEWEGO i duplikowanie danych – MrE

0

myślę, że to powinno działać:

class Membership(models.Model): 
    ... 

    class Meta: 
     ordering = ['date_joined'] 
+0

Niestety, nie działa, ManyRelatedManager wydaje się kopiować zamawianie modelu docelowego :( – pielgrzym

+0

To wydaje się głupie, prawda. Sugeruję otwarcie biletu i wprowadzenie go do grupy google django-dev – SmileyChris

+0

Dobry pomysł , Zrobię to i opublikuję tutaj, co wyłoniło się z dyskusji :) – pielgrzym

Powiązane problemy