Django的检索相关对象
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")
[Book: b7, Book: b6, Book: b5]
[Book: b7, Book: b6, Book: b5]
虽然我希望它在同一个订单时,您将它们添加打印为我加了他们这样
[Book: b6, Book: b5, Book: b7]
[Book: b7, Book: b6, Book: b5]
你失去联络您添加它们的顺序,因为它只设置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())
他们应该自动现在
抱歉,迟到回复。是的,你的答案对foreinkey是正确的。现在,让我们改变外键到多对多,然后采取另一种发行对象(比如P2),并以不同的顺序比前一个(B6,B5,B7),如B5,B6,B7增加书的对象。然后试着去理解在他们分别加入相同的顺序都出版商(p1和p2)一书的查询集。请给予回复。 –
@praveenchaudhary编辑您的问题 – maazza
编辑完成。请检查一下。 –
检查https://docs.djangoproject.com/en/1.10/ref/订购车型/查询集/#django.db.models.query.QuerySet.order_by – alphiii
我不能够找到我的答案。 –
所以你想以不同的顺序创建它? – RemcoGerlich