基于另一个类python/django的初始化递增一个类的变量
我的目标是显示特定竞赛的参赛作品总数。最初,我尝试在模板部分中这样做,在循环输入条目时为每个竞赛增加一个计数器。我的想法是,当创建参赛作品提交时,相应竞赛的总提交量应该增加,但我不确定如何做到这一点 型号:基于另一个类python/django的初始化递增一个类的变量,python,django,Python,Django,我的目标是显示特定竞赛的参赛作品总数。最初,我尝试在模板部分中这样做,在循环输入条目时为每个竞赛增加一个计数器。我的想法是,当创建参赛作品提交时,相应竞赛的总提交量应该增加,但我不确定如何做到这一点 型号: class Contest(models.Model): contest_name = models.CharField(max_length=200) contest_description = models.CharField(max_length=5000) c
class Contest(models.Model):
contest_name = models.CharField(max_length=200)
contest_description = models.CharField(max_length=5000)
contest_start_date = models.DateTimeField('start date')
contest_end_date = models.DateTimeField('end date')
submission_count = models.IntegerField(default=0)
def __str__(self):
return self.contest_name
class Submission(models.Model):
contest = models.ForeignKey(Contest, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
date_uploaded = models.DateTimeField(auto_now_add=True)
votes = models.IntegerField(default=0)
def __init__(self):
#increment the submission_count variable for the corresponding contest
使用模板的其他尝试:
<h1>Current Contests</h1>
<div class="row">
{% if current_contest_list %}
{% for contest in current_contest_list %}
<div class="col-sm-4"><h1><a href="{% url 'contests:detail' contest.id%}">{{ contest.contest_name }}</a></h1>
<img src="media/{{contest.display_image}}" class="img-responsive" alt="image">
{{ contest.contest_name }}
{% for submission in submission_list %}
{% if submission.contest == contest.contest_name %}
<P>Hi!</P>
{% endif %}
<p>{{ submission.contest }} {{ contest.contest_name }}</p>
{% if submission.contest == contest.contest_name %}
<P>Hi!</P>
{{ forloop.counter }}
{% set total_submissions = forloop.counter %}
{% endif %}
{% endfor %}
<p>Total entries: {{total_submissions}} </p>
当前竞赛
{%if当前的\u竞赛\u列表%}
{当前比赛列表%中的比赛的百分比}
{{contest.contest_name}
{提交中提交的百分比\列表%}
{%if submission.contest==contest.contest_name%}
嗨
{%endif%}
{{submission.contest}{{contest.contest_name}}
{%if submission.contest==contest.contest_name%}
嗨
{{forloop.counter}}
{%set total_submissions=forloop.counter%}
{%endif%}
{%endfor%}
总条目:{{Total_submissions}}
当我这样做时,total_submissions变量没有增加。我缺少什么?据我所知,添加新提交内容时,您希望增加竞赛的提交数量。要做到这一点,你需要
提交
插入数据库时,增加提交次数
提交时,减少提交次数
Submission
的save()
方法:
def save(self, *args, **kwargs):
if self.id is None: # To make sure this is an INSERT, not an UPDATE
contest = Contest.objects.select_for_update().get(id=self.contest.id)
contest.submission_count += 1
contest.save()
super().save(*args, **kwargs) # Call the "real" save() method.
要执行(2),您可以覆盖delete()
方法:
def delete(self):
contest = Contest.objects.select_for_update().get(id=self.contest.id)
contest.submission_count -= 1
contest.save()
super().delete()
请注意,如果批量创建或删除提交,则此解决方案不起作用。更多信息请访问
个人意见:我不会将提交数量存储在db中,除非用于计算提交数量的查询对性能有明显影响。Django确实不鼓励在模板内更改数据,而且这会使更改变得非常困难。您尝试执行的操作在模板中不起作用 在模板代码中,
提交列表
来自哪里?如果您想在竞赛列表
中迭代每个竞赛中的所有提交内容,您需要执行以下操作:
{% for submission in contest.submission_set.all %}
要获取计数,如果您的列表实际上是一个查询集(通常是)。。然后,获取模板内计数的最简单方法是在查询集上使用count
,例如:
{{ contest.submission_set.all.count }}
这将导致另一个数据库查询,但如果您不担心访问量过大,这应该没有问题。我不确定您是否可以更改模板变量的值,如
{%set total_submissions=forloop.counter%}
如果他想在数据库中保持计数,那么是的,就是这样,但是如果没有独占锁,如果两个人同时提交,这将导致一个竞赛条件。这是有道理的。谢谢@little_Birdiet谢谢你,我想这会有用的!我试图避免将计数存储在数据库中,但在运行查询时,我被难倒了。有无限的竞赛/提交,那么如何将适当的查询传递到模板中?自然的方法(对我来说,没有什么django经验)是将它们全部传递到模板中并执行上面的代码。但是这不起作用,所以我需要弄清楚如何在视图中为查询执行某种for循环,然后将提交计数列表传递到模板中@dvnguyensubmission_列表来自视图中的查询,是所有提交内容。我想这会管用,但我还没有试过。谢谢但是,这是对任何竞赛的所有参赛作品的查询集,还是仅对某一特定竞赛的参赛作品的查询集?我问这个问题的原因是,在你的模板代码中,看起来你正在循环当前所有的比赛。。然后,对于每个竞赛,您都会循环浏览提交列表。然后,您进入下一个竞赛,再次循环浏览提交列表。这将导致相同的提交被反复输出。我想你只想从一场比赛中获得参赛作品,在那场比赛之下,是不是?对,这是一个所有参赛作品的查询集。上面的大多数模板代码都是为了我的测试,以找出它为什么不能用于计数。我对如何运行查询感到困惑,因为您无法查询模板中的数据。我相信查询应该是:total\u count=submissions.filter(contest=contest.contest\u name).count,但我不确定它是否会正确引用contest.contest\u名称。另外,我是否只是在视图中做一个for循环,以便对每次竞赛进行计数?我想在主页上概述一下。“我真的很感谢你的帮助,”小小鸟说,“我成功了!”!!但是,它涉及到视图中的for循环,然后创建一个自定义模板标记,以通过模板中的键访问字典值。有没有更好的方法来实现这一点??完全不需要自定义模板标记。您只需计算视图函数中所需的任何值,然后将键添加到包含这些值的上下文中。。然后访问模板中的内容