我的生产服务器上有一种奇怪的行为。当我尝试通过反向外键过滤时,我收到一个不可能的错误,但在本地它工作正常,例如:
class Foo(models.Model):
pass
class Bar(models.Model):
name = models.CharField()
foo = models.ForeignKey('Foo', related_name='bars', blank=True, null=True, default=None)
现在尝试:
Foo.objects.filter(bars__name=xyz)
将导致
无法将关键字'bars'解析为字段。选择是:...
我使用Ubuntu 16.04和django 1.8.7
编辑1: 是否与使用字符串表示定义ForeignKeys的事实有关?
编辑2: 我发现使用class not string定义的关系,所以它也不适用于这种关系。
基本上模型Foo
有很多ForeignKey
个关系。在Foo
中很少,在目标模型中很少。从Foo
角度运行查询时,这些目标模型在生产中不存在。 Foo
中的这些可以用作查询参数。
编辑3: 我收到了有关服务器配置的详细信息以及何时发生错误。
有关出现问题的生产设置的信息:
Apache mpm_event config:
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
apache站点配置的相关部分:
WSGIDaemonProcess some_name group=some_name maximum-requests=1000 processes=2 threads=15 user=some_name
WSGIProcessGroup some_name
WSGIScriptAlias / "/usr/lib/python2.7/dist-packages/some_name/wsgi.py"
WSGIPassAuthorization On
基本上每个请求都不会发生错误。当它出现时,它来自一个工人。重新启动apache可以修复错误一段时间。
其中一个想法是加载django模型可能存在竞争条件。
答案 0 :(得分:1)
您尚未正确定义fk
:
class Foo(models.Model):
pass
class Bar(models.Model):
name = models.CharField()
foo = models.ForeignKey(Foo, related_name='bars', blank=True, null=True, default=None)
处理循环导入:
foo = models.ForeignKey('<app_name>.Foo', related_name='bars', blank=True, null=True, default=None)
答案 1 :(得分:1)
您必须在查询过滤器中使用related_query_name。默认情况下,在Django 1.8中它是模型名称,因此设置custom related_query_name或将代码更改为:
Foo.objects.filter(bar__name=xyz)