2009-02-25 30 views
16

Có thể đặt thứ tự sắp xếp mặc định cho mô hình thành một trường từ mô hình liên quan (chứ không phải là khóa số nguyên) tức là thứ gì đó tạo ra thứ tự SQL theo mệnh đề với một trường từ cả hai mô hình? Nếu vậy, làm thế nào? Tôi có thể làm điều này thông qua query_by nhưng tôi không thể tìm ra cách để thiết lập nó theo mặc định. Cảm ơn.Thứ tự sắp xếp mặc định của mô hình Django sử dụng trường bảng có liên quan

class Foo(models.Model): 
    name = models.CharField(max_length=50) 

class Bar(models.Model): 
    related = models.ForeignKey(Foo) 
    bar_date = models.DateField() 

    class Meta: 
     ordering = ('bar_date', 'related.name',) 

Trả lời

1

hmm ... Tôi đang giải quyết điều tương tự trong khi upfactoring ứng dụng django cũ, được viết trước qs-rf, ký hiệu "chấm" có thể được sử dụng ở đâu ??? ... tôi mất vài giờ để diclose "một cái gì đó" và tôi vẫn KHÔNG chắc chắn, nhưng ... cố gắng để thay thế dấu chấm với "__" (đôi gạch dưới), điều này có thể giúp, .. Trong thực tế, curentlly, tôi vẫn HOPE TOO :-)))

@stuart: cho "order_with_respect_to", tôi đã đọc nội dung nào đó về trường mô hình vật lý được thêm tự động vào bảng con ... Tôi không hiểu rõ mọi thứ ở đây ... Tài liệu IMHO rất tệ về thứ tự cú pháp, howgh!

không bình luận :-) http://code.djangoproject.com/ticket/8975

dù sao, tôi thích Django, nhưng ... :-))

2

Để thay thế cho order_with_respect_to (mà chỉ hỗ trợ một lĩnh vực), bạn có thể sử dụng một quản lý tùy chỉnh để cung cấp thứ tự. Điều này cũng cho phép bạn đặt hàng trên nhiều trường trong Foo và vẫn có trình quản lý Bar.objects bình thường. Bạn sẽ phải kiểm tra xem liệu sắp xếp thứ tự Meta.ordering hoặc tùy chỉnh được áp dụng trước hay chưa.

class FooSortedManager(models.Manager): 
    def get_query_set(self): 
     return super(FooSortedManager, self).get_query_set().order_by('foo__name') 

class Foo(models.Model): 
    name = models.CharField(max_length=50) 

class Bar(models.Model): 
    related = models.ForeignKey(Foo) 
    bar_date = models.DateField() 

    foo_sorted = FooSortedManager() 

    class Meta: 
     ordering = ('bar_date',) 
19

tôi sử dụng django 1.2.7 và thay vì kết nối ForeignKey.Attribute chúng ta nên sử dụng "__", do đó, mã này sẽ làm việc:

class Meta: 
    ordering = ('bar_date', 'related__name',) 
+0

+1 Đẹp và đơn giản – tatlar

0

Trong phiên bản hiện đại của django nó là:

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

Câu trả lời này không hữu ích vì nó không sử dụng từ ngữ thực tế từ câu hỏi nên không rõ sự khác biệt trong các phiên bản gần đây. – mastachimp

0
class Question(models.Model): 

    question_text=models.CharField(max_length=200) 
     class Meta: 
    verbose_name_plural=" Question" 

class Choice(models.Model): 

    question=models.ForeignKey(Question,on_delete=models.CASCADE) 
    class Meta: 
    verbose_name_plural=" Choice" 

hoặc bạn có thể thay đổi số lượng khoảng trống trước tên lớp như trên hoặc đặt hàng nó sử dụng số như sau:

class Question(models.Model): 

    question_text=models.CharField(max_length=200) 
     class Meta: 
    verbose_name_plural="1.Question" 

class Choice(models.Model): 

    question=models.ForeignKey(Question,on_delete=models.CASCADE) 
    class Meta: 
    verbose_name_plural="2.Choice" 
Các vấn đề liên quan