2016-12-31 59 views
2
class Publisher(models.Model): 
    name = models.CharField(max_length=300, null=True, blank=True) 
class Book(models.Model): 
    name = models.CharField(max_length=300, null=True, blank=True) 
    publisher = models.ManyToManyField(Publisher,related_name='b', null=True) 
    _published_at = models.DateTimeField() 
from polls.models import Book, Publisher 
p1=Publisher.objects.get(id=1) 
p1.b.clear() 
p1.save() 
b6=Book.objects.get(id=6) 
p1.b.add(b6) 
b6._published_at = datetime.now() 
p1.save() 
b5=Book.objects.get(id=5) 
p1.b.add(b5) 
b5._published_at = datetime.now() 
p1.save() 
b7=Book.objects.get(id=7) 
p1.b.add(b7) 
b7._published_at = datetime.now() 
p1.save() 

p2 = Publisher.objects.get(id=2) 
p2.b.clear() 
p2.save() 
b7=Book.objects.get(id=7) 
p2.b.add(b7) 
b7._published_at = datetime.now() 
p2.save() 
b6=Book.objects.get(id=6) 
p2.b.add(b6) 
b6._published_at = datetime.now() 
p2.save() 
b5=Book.objects.get(id=5) 
p2.b.add(b5) 
b5._published_at = datetime.now() 
p2.save() 

print p1.b.order_by("_published_at") 
print p2.b.order_by("_published_at") 

它打印Django的檢索相關對象

[Book: b7, Book: b6, Book: b5] 
[Book: b7, Book: b6, Book: b5] 

雖然我希望它在同一個訂單時,您將它們添加打印爲我加了他們這樣

[Book: b6, Book: b5, Book: b7] 
[Book: b7, Book: b6, Book: b5] 
+0

檢查https://docs.djangoproject.com/en/1.10/ref/訂購車型/查詢集/#django.db.models.query.QuerySet.order_by – alphiii

+0

我不能夠找到我的答案。 –

+0

所以你想以不同的順序創建它? – RemcoGerlich

回答

2

你失去聯絡您添加它們的順序,因爲它只設置Book的外鍵。

你可以做的就是添加一個DateTimeField()您的圖書,並設置它,當你將它添加到出版商和ORDER_BY它。

類似:

class Book(models.Model): 
    name = models.CharField(max_length=300, null=True, blank=True) 
    _published_at = models.DateTimeField() 
    publisher = models.ForeignKey(Publisher,related_name='b', null=True) 

的,當你添加它

p=Publisher.objects.get(id=2) 
p.b.clear() 
p.save() 
b6=Book.objects.get(id=6) 
p.b.add(b6) 
b6._published = datetime.now() 
b6.save() 
p.save() 
b5=Book.objects.get(id=5) 
p.b.add(b5) 
b5._published = datetime.now() 
b5.save() 
p.save() 
b7=Book.objects.get(id=7) 
p.b.add(b7) 
b7._published = datetime.now() 
b7.save() 
p.save() 

,當你打印它:

p.b.order_by("_published_at") 

編輯: 你對你所需要的ManyToManyField問題定製的「通過」型號 看到https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

class Publisher(models.Model): 
    name = models.CharField(max_length=300, null=True, blank=True) 

class Book(models.Model): 
    name = models.CharField(max_length=300, null=True, blank=True) 
    publisher = models.ManyToManyField(Publisher,related_name='b',through="Publication",null=True) 
    _published_at = models.DateTimeField() 

class Publication(models.Model): 
    book = models.ForeignKey(Book, on_delete=models.CASCADE) 
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) 
    _published_at = models.DateField() 

    class Meta: 
     ordering = ['_published_at'] 

你也不能使用add()添加新的發佈商,您需要定義新車型這樣做。

所以要加出版商P3預訂B7你需要做的

Publication.objects.create(book=b7, publisher=p3, _published_at=datetime.now()) 

他們應該自動現在

+0

抱歉,遲到回覆。是的,你的答案對foreinkey是正確的。現在,讓我們改變外鍵到多對多,然後採取另一種發行對象(比如P2),並以不同的順序比前一個(B6,B5,B7),如B5,B6,B7增加書的對象。然後試着去理解在他們分別加入相同的順序都出版商(p1和p2)一書的查詢集。請給予回覆。 –

+0

@praveenchaudhary編輯您的問題 – maazza

+0

編輯完成。請檢查一下。 –