2009-09-07 22 views
8

Tôi có một vấn đề bất thường. Chúng ta hãy xem xét mô hình như vậy (lấy từ tài liệu django):Đặt hàng mặc định cho các mặt hàng m2m bởi trường mô hình trung gian ở 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) 

Bây giờ, chúng ta hãy nói rằng chúng ta đã có 2 thành viên Beatles trong ban nhạc Beatles ra (làm theo tấm gương trong tài liệu django cho các mô hình trung gian):

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

Mã trên sẽ trả lại các thành viên được sắp xếp theo đặt hàng mặc định cho mô hình Người. Nếu tôi chỉ định:

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

thành viên, được sắp xếp qua ngày tham gia. Tôi có thể bằng cách nào đó thiết lập điều này như là hành vi mặc định cho trường ManyToMany này? Đó là đặt thứ tự mặc định của các mục liên quan theo trường trong mô hình trung gian? Các ManyRelatedManager dường như có một đối số init core_filters, nhưng tôi không có ý tưởng mơ hồ làm thế nào để truy cập nó withous subclassing toàn bộ lĩnh vực m2m trong django. Bất kỳ ý tưởng sáng tạo nào? :)

Cảm ơn trước :)

tôi đã mở một ticket in django trac.

Trả lời

4

Dưới đây là một phương pháp bẩn-hack để đạt được điều này (nhìn vào mô hình 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) 

Không bận tâm đến việc tạo ra một bộ trang trí đặc tính, nhưng nó khá dễ bắt chước thiết lập của trường gốc. Giải pháp xấu xí, nhưng có vẻ như là lừa.

+0

phương pháp này trả về nhiều hồ sơ hơn dự kiến ​​cho tôi. nó kết thúc bằng việc tạo ra một OUTER LEFT JOIN và sao chép dữ liệu – MrE

0

Tôi nghĩ rằng điều này sẽ làm việc:

class Membership(models.Model): 
    ... 

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

Thật không may là không, ManyRelatedManager dường như sao chép thứ tự của mô hình đích: ( – pielgrzym

+0

Điều đó có vẻ câm, không phải nó. Tôi đề nghị mở một vé và mang nó lên trong nhóm django-dev google – SmileyChris

+0

Ý tưởng hay , Tôi sẽ làm điều đó và đăng lại ở đây những gì nổi lên của cuộc thảo luận :) – pielgrzym

Các vấn đề liên quan