Django ORM无法通过反向外键

时间:2017-07-06 10:24:18

标签: django apache django-models mod-wsgi wsgi

我的生产服务器上有一种奇怪的行为。当我尝试通过反向外键过滤时,我收到一个不可能的错误,但在本地它工作正常,例如:

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版本:2.4.18-2ubuntu3.3
  • libapache2-mod-wsgi version:4.3.0-1.1build1

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模型可能存在竞争条件。

2 个答案:

答案 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)