我可以将一对一与键值模型联系起来吗?

时间:2013-09-13 11:53:44

标签: python django django-models

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

< /编辑>

由于keyFooOption的数量有限,我想使用Django的ORM稍微改一下这种关系。当前设计将关系描绘为FooFooOption之间的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进行编码?怎么样?

1 个答案:

答案 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')]