Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 选择不按预期工作的\u相关(和预回迁\u相关)?_Python_Django_Django Orm - Fatal编程技术网

Python 选择不按预期工作的\u相关(和预回迁\u相关)?

Python 选择不按预期工作的\u相关(和预回迁\u相关)?,python,django,django-orm,Python,Django,Django Orm,我的模型: class Anything(models.Model): first_owner = models.ForeignKey(Owner, related_name='first_owner') second_owner = models.ForeignKey(Owner, related_name='second_owner') class Something(Anything): one_related = models.ForeignKey(One, r

我的模型:

class Anything(models.Model):
    first_owner = models.ForeignKey(Owner, related_name='first_owner')
    second_owner = models.ForeignKey(Owner, related_name='second_owner')

class Something(Anything):
    one_related = models.ForeignKey(One, related_name='one_related', null=True)
    many_related = models.ManyToManyField(One, related_name='many_related')

class One(models.Model):
    first = models.IntegerField(null=True)
    second = models.IntegerField(null=True)
在我的代码中,我想用以下代码对我的数据库做一个小摘要:

all_owners = Owner.objects.all()
first_selection = []
second_selection = []

objects = {}

for owner in all_owners:
<<0>>    
items = Something.objects.filter(Q(first_owner=owner)|Q(second_owner=owner)).order_by('date').all() 

    #Find owners, who have at least 100 "Something" elements related
    if(items.count() > 100):
        first_selection.append(owner)
        objects[owner] = items

    #Find owners, who have at least 80 "Something" with at least one many_related elements related,
    if(items.filter(many_related__isnull=False).distinct().count() > 80):
        second_selection.append(owner)
        objects[owner] = items

# Now i pass first_selection and second_selection and objects to functions, but following loops will produce the same problem im getting:

<<1>>
for owner in first_selection:
    for something in objects[owner]:
        rel = something.one_related
        print(str(rel.first) + "blablabla" + str(rel.second))
<<2>>
for owner in first_selection:
    for something in objects[owner]:
        rel = something.one_related
        print(str(rel.first) + "blablabla" + str(rel.second))

<<3>>
for owner in second_selection:
    for something in objects[owner]:
        rel = something.many_related.first()
        if rel != None""
            print(str(rel.first) + "blablabla" + str(rel.second))
<<4>>
for owner in second_selection:
    for something in objects[owner]:
        rel = something.many_related.first()
        if rel != None:
            print(str(rel.first) + "blablabla" + str(rel.second))
当我查看生成的查询时,它似乎会对表执行联接。
但问题仍然存在(第一个循环需要几分钟,第二个循环需要几秒钟),事实上,我使用mysqltuner显示执行的查询数-它在第一个循环中不断增长,尽管它不应该


我想这同样适用于第三和第四个循环以及预取相关,尽管我甚至没有足够的内存来测试它。

因此,我知道在没有参数的情况下调用select_related()不会预取可为空的对象。但我不知道,在调用select_related('one_related')后,如果相关对象的字段可为空,它将只选择相关对象的id

总而言之,我的问题的答案是取代:

Something.objects.select_related('one_related')


您在哪里使用预回迁?我没有看到它。我在这里没有使用它,我在这里使用的是select REFECTION,我以前在其他一些情况下使用过prefetch_REFECTION,但遇到了相同的问题。
team
变量初始化在哪里。你的代码有点难理解。试着把它格式化好
Something.objects.select_related('one_related')
Something.objects.select_related('one_related', 'one_related__first', 'one_related__second')