考虑这个 Django 模式:
class Foo(models.Model):
# ...
class FooOption(models.Model):
foo = models.ForeignKey(foo, related_name='options')
key = models.CharField(max_length=64)
value = models.TextField()
class Meta:
unique_together = [('foo', 'key')]
本质上,FooOptions
为每个Foo
.
<编辑>
- 系统使用一组已知的密钥,
- 每个 Foo 都有许多 (key, value) 对,其中值是任意的,
- 或者等效地,每个 Foo可以为每个key有一个值。
</编辑>
由于key
s的数量有限FooOption
,我想使用 Django 的 ORM 重新表述这种关系。当前设计将关系描述为 aFoo
和FooOption
s 之间的 1-n;我希望代码将其描绘为 aFoo
和每个特定FooOption
键之间的 1-1。
这将允许我访问每个选项,如下所示:
class Foo(models.Model):
# ...
opt1 = OptionField('colour')
opt2 = OptionField('size')
foo = Foo()
foo.opt1 = 'something'
foo.save()
特别是,我希望在查询许多 s 时能够指定select_related
特定的s,以获得 ORM-ed 的等价物:FooOption
Foo
SELECT foo.*, opt_colour.value, opt_size.value
FROM foo
LEFT JOIN foo_option opt_colour
ON foo.id = foo_option.foo_id AND foo_option.key = 'id'
LEFT JOIN foo_option opt_size
ON foo.id = foo_option.foo_id AND foo_option.key = 'size';
是否可以编写这样的自定义代码OptionField
?如何?