0

次の 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ですか? どのように?

4

1 に答える 1

0

私はあなたのデザインを誤解しているかもしれませんが、実際には多対多の関係を使用する必要があるようです。各 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')]
于 2013-09-13T13:42:42.133 に答える