我想列出用户的所有会话。如下图所示,对话模型未直接连接到User表。这是一个自由职业者网站项目,用户可以注册为工作人员来完成用户发布的工作。
我想要的结果是:
my_conversations = User.Conversation.all()
我们的图片我有2个用户,其中一个是注册工作者。然后它看起来如下:
**Users**
id Name ...
1 John
2 Bob
**Worker**
id user_id ...
1 2
约翰发布了一些工作。我们在JOB
表中添加了1个新条目。
**Job**
id title user_id
1 Help me design a database 1
这是M-to-M关系(工人可以申请许多工作,一个工作可以有很多工人),我们定义一个新表job_has_worker
。
对于每个job_has_worker
,应该有一种方式在工人和工作海报之间进行沟通。
现在我想让Django做的是加载登录用户的所有对话,例如为我发布的工作加载我的对话列表。
观看次数 - 我的已发布作业
User = request.user
Jobs = User.job_set.all()
观点 - 我的对话,这就是我需要的
User = request.user
Jobs = User.job_set.all()
for job in Jobs:
# load conversations
converstation = job.converstation_set.all()
# also somehow append this to all conversations
观看次数 - 消息 首先,我需要获得对话ID
Messages = Conversation.get(pk=pk).message_set.get_all()
我将使用if循环添加一些安全性,例如
if request.user.id not in message.sender || message.receiver
return false
编辑:
Models.py
class Worker(models.Model):
user = OneToOneField(User)
class Conversation(models.Model):
#What to here?
#Job_Has_Worker = ForeignKey(Job, Worker)
class Message(models.Model):
body = models.TextField(max_length=500, blank=False)
sender = models.IntegerField()
receiver = models.IntegerField()
conversation = models.ForeignKey(Conversation)
class Job(models.Model):
title = models.CharField(max_length=100, blank=False)
description = models.TextField(max_length=500, blank=False)
workers = models.ManyToManyField(Worker)
答案 0 :(得分:1)
如果没有涉及Conversation
的关系字段,我无法完全回答这个问题,但这是使用Job
的示例:
# All jobs for a given user:
Jobs.objects.filter(workers__user=request.user)
您列出的User.job_set.all()
示例不起作用,User
与Job
没有直接关系,因此它不具有job_set
属性。< / p>
假设在作业/工作者m2m隐式Conversation
模型上使用ForeignKey声明through
:
class Conversation(models.Model):
job_worker = ForeignKey(Job.workers.through)
(感谢How can I use the automatically created implicit through model class in Django in a ForeignKey field?提供引用隐式through
模型的语法。)
然后这样的事情应该能够得到对话:
Conversation.objects.filter(job_worker__worker__user=request.user).distinct()
或者这是为了获取消息:
Messages.objects.filter(conversation__job_worker__worker__user=request.user).distinct()
当然,您可以使用through
ManyToManyField
参数来获取中间模型的名称,而不是Job.workers.through
。
您也可以从实例中走回来,因为您正朝着user.job_set.all()
方向前进 - 它必须是user.worker.job_set.all()
才能启动,并且您需要检查以确保user
1}}首先有一个非空的worker
,但因为job_set
本身就是一个管理器,它返回job
的查询集,这对于这种间接关系来说更麻烦一些。 some_worker.job_set.filter(...)
比Job.objects.filter(worker=some_worker, ...)
更清晰,因此取决于具体情况。