我有一个数据库中的两个表(我创建):Entry
和Nation
。每次创建新条目时,用户都必须填写与其相关的国家/地区。所以一个条目有两个字段:Content
[一个charfield]和Nation
[一个国家的外键]。问题是,在网站的主页上,按照他们有多少条目顺序显示最受欢迎的国家。看起来Entry
表中有多少外键与每个Nation
有关,所以我不知道如何保留一个计数器似乎效率低下。我的意思是,如果我为国家创建一个额外的整数字段,我怎么能这样做,以便每次创建一个条目时,它将正确的国家递增1,并且每当一个条目被销毁时,它就会减少正确的国家减1。如何跟踪有多少外键连接到一个对象?
2
A
回答
2
你可以使用post_save
信号,这是在save()
方法结束时发送。
首先,将counter = IntegerField(default=0)
添加到Nation
型号中(如您所述)。
然后,每创建一个新的Entry
,增加该计数器。
from django.db.models.signals import post_save
# Your models ...
def increase_nation_counter(instance, created, **kwargs):
if created: # Just increase counter if it's a new Entry
instance.nation.counter += 1
instance.nation.save()
post_save.connect(increase_nation_counter, sender=Entry)
然后,你可以在你的Nation
揭示了一个简单的查询排序:
Nation.objects.order_by('-counter')
2
您可以使用aggregation。这样,您的模式保持正常化,并且您不会有数据不一致的可能性。你的问题似乎与其中引用的例子之一相同。试试这个:
from django.db.models import Count
Nation.objects.annotate(num_entries=Count('entry')).order_by('-num_entries')
相关问题
- 1. 保持跟踪一个对象在Django中接收到多少个视图
- 2. 如何跟踪多个对象位置?
- 3. 如何跟踪多个对象实例?
- 4. 如何跟踪外键?
- 5. 爪哇 - 跟踪有多少对象已经被其他物体
- 6. 如何跟踪同一用户(对象)的多个实例
- 7. Vanilla JS:如何跟踪另一个对象的对象属性?
- 8. 当连接空PK实体时,异常“无法使用同一个键跟踪多个对象”
- 9. 使用Opencv Python跟踪多个对象
- 10. 从外键连接到多个表
- 11. 内有2个外键连接到一个主键
- 12. IMAP连接跟踪
- 13. 在angularjs中跟踪一个对象
- 14. 角ngOptions跟踪的对象键
- 15. 如何将一对多连接查询的结果减少到每个“一个”的标志对象?
- 16. 跟踪调用了多少个信号?
- 17. 跟踪firstResponder对象
- 18. 我如何跟踪wifi连接状态?
- 19. 跟踪异常JDBC连接如何
- 20. 连接三个表与外键和多对一
- 21. 如何在多对多丰富的连接中编写外键?
- 22. 如何访问跟踪器(antonioribeiro /跟踪器)对象在Laravel
- 23. 内有多个左外连接连接
- 24. 我如何使用GKPeerPickerController对象连接到多个对等点
- 25. GPS跟踪没有互联网连接的另一个设备
- 26. C++:跟踪所有现有的对象
- 27. 多对多的关系 - 让所有的对象链接到另外一个
- 28. NHiberate多对多没有连接表或外键
- 29. mysql显示有多少个连接到一个表
- 30. 如何跨线程跟踪NSError对象?