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 都有许多 (key, value) 对,其中值是任意的,
  • 或者等效地,每个 Foo可以为每个key有一个值。

</编辑>

由于keys的数量有限FooOption,我想使用 Django 的 ORM 重新表述这种关系。当前设计将关系描述为 aFooFooOptions 之间的 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 的等价物: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 回答