我正在尝试在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之间没有任何继承/抽象模型实现,因为它们没有关联。
谢谢!
答案 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