Django - 按字段值获取对象(模型未知)

时间:2015-11-27 14:21:50

标签: python django object generics django-queryset

我正在尝试在Django中创建一个包含通用外键的对象,我希望以允许我创建它的方式编写它而不指定该通用FK的对象类型,只是对象的ID。

例如,如果我有这个:

class Foo1 (models.Model):
    uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
    ...

class Foo2 (models.Model):
    uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
    ...

class Foo3 (models.Model):
    uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
    ...

class Bar (models.Model):
    foo_type = models.ForeignKey(ContentType, related_name="content_type")
    foo_id = models.PositiveIntegerField()
    foo_object = GenericForeignKey('foo_type', 'foo_id')...

我希望能够通过提供UUID(在整个数据库中应该是唯一的)来获得属于任何Foos的对象。

我想这会是这样的:

GenericFoo.objects.get(uuid=uuid)

这在Django中完全可以吗?

请注意我目前在Foos之间没有任何继承/抽象模型实现,因为它们没有关联。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不相信你可以从SQL数据库中获取一个对象,而无需搜索它可能存在的每个表。

但是你可以在Django中编写一个为你做这个的方法:

def get_by_uuid(uuid):
    for Model in [Foo1, Foo2, Foo3]:
        try:
            return Model.objects.get(uuid=uuid)
        except Model.DoesNotExist:
            pass
    return None  # Maybe you want to raise an exception here instead

请注意,数据库不会确保uuids在所有表中都是唯一的,但如果使用uuid.uuid4()生成它们,则不应该发生任何冲突。

如果您不想对模型列表进行硬编码,则可以内省applications