将contentType用于raw_id_fields

时间:2010-08-07 11:19:44

标签: django-admin contenttype

在我的应用程序中,我有一个模型定义,如:

class SomeModel(models.Model):
    someFK = Models.ForeignKey(SomeModel, null=True, blank=True)
    otherFK = Models.ForeignKey(OtherModel, null=True, blank=True)
    ...

此模型保留有关Logs的数据,并且要记录的模型不止一种,因此我为每个相关模型放置了一个FK。对于每条记录,只使用其中一个FK,其他FK设置为​​NULL = True。

但是当我需要记录其他东西时,我不想改变我的模型。所以我改变了我的模型:

class SomeModel(models.Model):
    content_type = models.ForeignKey(ContentType)
    content_id = models.IntegerField()

所以我用以下来得到我想要的东西:

content_type.get_object_for_this_type(id=content_id)

没关系。但是当admin.py发挥作用时,它会导致问题,因为我有一些相关模型的1.000.000+数据需要记录,所以我需要使用raw_id_fields。由于我没有每个相关模型的FK,我必须使用ContentType模型和content_id,但我不知道如何使用ContentType?

2 个答案:

答案 0 :(得分:3)

Django grappelli扩展了generic lookup中的Django管理功能。 所以你的ModelAdmin可以有类似的东西:

class SomeModelAdmin(ModelAdmin):
    related_lookup_fields = {
        'generic': [['content_type', 'object_id'], ],
    }

Result

它解决了我的查找问题。我希望这也能解决你的问题。

答案 1 :(得分:1)

我知道这并不能完全回答你的问题,但你应该使用泛型关系而不是多个外键。然后,您可以实现所需的最终目标。