次の 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 には多数の (キー、値) ペアがあり、値は任意です。
- または同等に、すべての Fooはすべての単一のキーに対して 1 つの値を持つことができます。
</編集>
key
のの数は限られFooOption
ているため、この関係を Django の ORM を使用して少し言い換えたいと思います。Foo
現在の設計では、aとFooOption
s の間の 1-n としての関係が描かれています。Foo
コードで aと特定の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 化された同等のものを取得できるようにしたいと考えています。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
ですか? どのように?