【发布时间】:2014-05-09 09:05:57
【问题描述】:
我正在使用 Django 构建一个事件平台,其中包含一些事件 public 和一些 invite-only。以下是它的基本工作原理:
-
每个事件都基于 Event 模型。
-
私人活动只有受邀的客人才能看到:这是实现的 通过引用事件和来宾的 Invite 模型。
-
用户可以告知他们是否会参加活动 通过存储关联事件的Answer模型,用户 和答案。
-
Answer 和 Invite 模型完全相互独立,这样我就可以将 Answer 模型用于公共和私人活动。
我想要达到的目标:
对于我被邀请的每个事件,显示邀请(event.creator 邀请您到 event.name),如果存在,我的相关答案,否则显示一个表单来回答。
所以我认为我正在尝试做的是获取我被邀请的所有事件(我对此没有问题)并将其加入我的答案(其中用户=我)。问题是答案可能还不存在——如果我还没有回答的话。
理想情况下,我会将所有这些都放在一个查询中,这样我就可以在模板中执行类似的操作:invite_event.answer 并显示答案(如果存在)。
编辑:
所以我认为我最终需要的是混合两个查询:一个获取我被邀请的所有事件 (1),另一个获取这些事件的所有答案 (2)。
(1)
latest_events_invited = Event.objects.filter(invite__user_invited=request.user)
(2)
answers_events_invited = Answer.objects.filter(user_answering=request.user, event__in=latest_events_invited)
类似于:对于 latest_events_invited 中的每个事件,附加来自 answers_events_invited 的相应答案。
有什么想法吗?
代码:
我的模板(index.html):
<h3>Invites</h3>
{% if latest_invites_list %}
<ul>
{% for event in latest_events_invited %}
<li>
{{ event.creator }} invited you to {{ event }}<br/ >
<!--IDEALLY:-->
{% if event.answer %}
You answered: {{ answer.answer }}
{% else %}
<form action="{% url 'events:answer_event' invite.event.id %}" method="post">
{% csrf_token %}
Answer:
<select name="answer">
<option value="1" >Attending</option>
<option value="2" >Not attending</option>
</select>
<input type="submit" name="submit" value="Answer">
</form>
{% endif %}
</li>
</ul>
{% else %}
<p>No invites.</p>
{% endif %}
视图(views.py)
def index(request):
if request.user.is_authenticated():
latest_events_invited = Event.objects.filter(invite__user_invited=request.user)
latest_answers_list = Answer.objects.filter(user_answering=request.user, event__in=latest_events_invited)
#do something with those to get: "latest_events_invited_with_answers"
context = {'latest_events_invited':latest_events_invited, 'latest_answers_list':latest_answers_list}
else:
[...]
return render(request, 'events/index.html', context)
还有模特。
活动
class Event(models.Model):
PRIVACY_CHOICES = (
(0, 'Public'),
(1, 'Invite only'),
)
name = models.CharField(max_length=200)
[...]
privacy = models.PositiveSmallIntegerField(max_length=1, choices=PRIVACY_CHOICES, default=0)
invited = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Invite', related_name='events_invited', blank=True)
answers = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Answer', related_name='events_answered', blank=True)
邀请
class Invite(models.Model):
user_invited = models.ForeignKey(settings.AUTH_USER_MODEL)
event = models.ForeignKey(Event)
created = models.DateTimeField(default=timezone.now, editable=False)
class Meta:
unique_together = (("user_invited", "event"),)
回答
class Answer(models.Model):
ANSWER_CHOICES = (
(1, 'Attending'),
(2, 'Not attending'),
)
user_answering = models.ForeignKey(settings.AUTH_USER_MODEL)
event = models.ForeignKey(Event)
answer = models.PositiveSmallIntegerField(max_length=1, choices=ANSWER_CHOICES)
class Meta:
unique_together = (("user_answering", "event"),)
希望这里有人可以帮助我。
谢谢。
【问题讨论】:
标签: mysql sql django postgresql