如何将所有引用模型的模型加入到Django的一个表中?

时间:2012-02-23 00:26:48

标签: python django join django-models

我有多个Django模型使用外键引用模型:

class LocationHistory(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

class UserSynthVals(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

class RegionalVictoryRate(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

WorldGrid只是:

class WorldGrid(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()
    ...

现在,我能够获得所有引用WorldGrid的模型(抽象地用于可重用性):

models_that_reference = [i.model for i in get_model('appname',model_name)._meta.get_all_related_objects()]

在那一点上,我可以遍历它们获取他们的model.objects.all()。values(),但我找不到将这些单独的对象列表连接成一个然后我可以输出到表的方法。

我宁愿做更多关于django预期用途的事情(就像select_related()所做的那样)并保持这种抽象。

任何帮助解决这个问题的人都会受到赞赏,或者尝试新方向。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用过滤器执行此操作。您希望将WorldGrid加入其相关模型,并过滤掉没有连接的位置。

WorldGrid.objects.filter( regionalvictoryrate_region__isnull=False,
                      usersynthvals_region__isnull=False,
                      locationhistory_region__isnull=False )

请参阅此处的注释。 https://docs.djangoproject.com/en/dev/topics/db/queries/

答案 1 :(得分:0)

在过去,我已经修改并使用来自管理员的get_deleted_objects函数,在django.contrib.admin.util中执行此操作,返回所有相关对象并显示它们或以某种形式操作它们。这可能是完成你想要的一个好的开始。

答案 2 :(得分:0)

我能够找到一种非常好的方法,而select_related确实是关键。一旦我有一个参考模型列表,我就可以做到:

fields_that_reference = [[m._meta.object_name.lower()+'__'+f.name for f in m._meta.fields if not isinstance(f,related.ForeignKey) ] for m in models_that_reference]

for i in fields_that_reference:
    fields +=i

要获取我想要立即查看的所有字段,然后:

all_objects = get_model('appname',model_name).objects.select_related().values(*fields)

将它们全部放入一个巨大的列表中。如果你的模型是历史性的(带有日期时间字段),或者有圆形的外键,你可能需要在显示它之前再修剪一下这个结果,但是这样可以很好地将所有内容组合在一起。