gpt4 book ai didi

mysql - Django:将两个查询(两个不同模型)中的项目组合在一起

转载 作者:行者123 更新时间:2023-11-30 00:27:52 24 4
gpt4 key购买 nike

我正在使用 Django 构建一个事件平台,其中一些事件是公开,一些仅限邀请。它的基本工作原理如下:

  • 每个事件都基于事件模型。

  • 私有(private)事件只有受邀嘉宾才能观看:这已实现通过引用事件和嘉宾的邀请模型。

  • 用户可以告知他们是否将参加事件通过存储关联事件、用户的Answer模型以及答案。

  • AnswerInvite 模型完全相互独立,这样我就可以使用 Answer 模型公共(public)和私有(private)事件。

<小时/>

我想要实现的目标:

对于我受邀参加的每个事件,显示邀请(event.creator 邀请您参加 event.name),如果存在,则显示我的关联答案,否则显示要回答的表单。

所以我认为我想做的是获取我被邀请的所有事件(我对此没有问题)并将其加入到我的答案中(其中 user=me)。问题是,如果我没有回答的话,答案可能还不存在。

理想情况下,我会将所有这些都包含在一个查询中,以便我可以在模板中执行类似的操作:invited_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 %}

View (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"),)

希望这里有人可以帮助我。
谢谢。

最佳答案

一个选项是每当邀请某人时自动添加答案,默认为“否”。使用 Invite 的 post_save 信号或覆盖保存方法,这样您就不必每次都创建关联的答案。

另一个可能更好的选择是在 View 中而不是在模板中执行逻辑。检查答案是否存在;如果是,则将答案列表传递给模板;如果没有,则传递一个空列表。

编辑:或者,更好的是:

在 View 中:

try:
user_answer = Answer.objects.filter(user_answering = request.user).filter(event=event)
except ObjectDoesNotExist:
answer = None

编辑2:或者怎么样:

Answer.objects.filter(user_answering = request.user).filter(event__in=Event.objects.filter(user__in = event.invited))

关于mysql - Django:将两个查询(两个不同模型)中的项目组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22737637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com