次の 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とFooOptions の間の 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 化された同等のものを取得できるようにしたいと考えています。FooOptionFoo
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ですか? どのように?