Django,列出了连接模型的查询集

时间:2018-01-19 15:08:23

标签: django

我想列出用户的所有会话。如下图所示,对话模型未直接连接到User表。这是一个自由职业者网站项目,用户可以注册为工作人员来完成用户发布的工作。

我想要的结果是:

my_conversations = User.Conversation.all()

我添加了这张图片,因为它描绘了我将在下面总结的所有内容。enter image description here

我们的图片我有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)

1 个答案:

答案 0 :(得分:1)

如果没有涉及Conversation的关系字段,我无法完全回答这个问题,但这是使用Job的示例:

# All jobs for a given user:
Jobs.objects.filter(workers__user=request.user)

您列出的User.job_set.all()示例不起作用,UserJob没有直接关系,因此它不具有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, ...)更清晰,因此取决于具体情况。