+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

正向和反向查询到ManyToMany关系Django

发布于2020-07-02 21:42     阅读(251)     评论(0)     点赞(25)     收藏(1)


我有这个模型:

class Task(MPTTModel, TimeStampedModel, StartFinishModel):
    name = models.CharField(max_length=256)
    start_after_end = models.ManyToManyField('self',                                    
                                             related_name='s2e_relation',
                                             blank=True) 
    #s2e means that task can't start before related tasks end

如何获得所有无法在此任务结束之前启动的任务以及所有必须在此任务开始之前终止的任务。

Let's say 1 -> 2 -> 3

我有身份证2我想找到3另一个查询1
找到3我可以使用Task.objects.get(id = 2).start_after_end.all()
如何找到1

更新1
实际上发现了更大的问题-如果我选择2 related to 1-1会立即改变与1 is related to 2


解决方案


如果与建立关系'self',默认情况下Django将使该关系对称这意味着,如果一个对象a一个朋友b,那么b自动具有一个朋友a因此,这意味着这里的关系如下所示:

# symmetrical relation
1  <---> 2 <---> 3

因此,这意味着:

task1.start_after_end.all()  # ==> [2]
task2.start_after_end.all()  # ==> [1, 3]
task3.start_after_end.all()  # ==> [2]

这样在这里13都将被视为Task2.start_after_end.all()s。您可能希望这样:您希望关系是非对称的

因此,您应将字段编辑为:

class Task(MPTTModel, TimeStampedModel, StartFinishModel):
    name = models.CharField(max_length=256)
    start_after_end = models.ManyToManyField(
        'self',                                    
        related_name='s2e_relation',
        symmetrical=False,
        blank=True
    )

现在上面看起来像:

# asymmetrical relation
1   ---> 2  ---> 3

注意,非对称关系不是 反对称关系。它仍然是可以添加task1start_after_endtask2,但它不会在您添加的情况下自动执行此操作task2start_after_endtask1

所以现在完成了,这意味着对于some_task,我们将获得下一个任务:

my_task.start_after_end.all()  # the next ones

我们用related_name

my_task.s2e_relation.all()     # the previous ones

因此,例如:

task1 = Task.objects.create(name='task1')
task2 = Task.objects.create(name='task2')
task3 = Task.objects.create(name='task3')

task1.start_after_end.add(task2)
task2.start_after_end.add(task3)

然后,如果触发关系,我们将得到:

task1.start_after_end.all()  # ==> [2]
task2.start_after_end.all()  # ==> [3]
task3.start_after_end.all()  # ==> []

task1.s2e_relation.all()  # ==> []
task2.s2e_relation.all()  # ==> [1]
task3.s2e_relation.all()  # ==> [2]


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/433199/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)