考虑这个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
设置了一个键值集。
<编辑>
< /编辑>
由于key
中FooOption
的数量有限,我想使用Django的ORM稍微改一下这种关系。当前设计将关系描绘为Foo
和FooOption
之间的1-n;我希望代码在Foo
和每个特定FooOption
密钥之间将其描述为1-1。
这将允许我访问这样的每个选项:
class Foo(models.Model):
# ...
opt1 = OptionField('colour')
opt2 = OptionField('size')
foo = Foo()
foo.opt1 = 'something'
foo.save()
特别是,我希望在查询许多select_related
时能够FooOption
具体Foo
,以获得与ORM相当的:{/ p>
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
进行编码?怎么样?
答案 0 :(得分:0)
我可能会误解你的设计,但看起来你实际上应该采用Many-to-many关系。你似乎想为每个Foo实例提供多个选项(即颜色,大小等),我想你会想要一个特定的颜色或大小来描述各种Foo。
class Foo(models.Model):
options = models.ManyToManyField('FooOption')
# Other attributes.
class FooOption(models.Model):
key = models.CharField(max_length=64)
value = models.TextField()
class Meta:
unique_together = [('key', 'value')]