2016-12-31 69 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

编辑完成。请检查一下。 –