自然键序列化Django模型,以一对一字段作为主键

时间:2015-02-24 17:21:51

标签: python json django serialization django-fixtures

我有一个Recipe模型和Label模型,前者带有OneToOneField。我将管理器和natural_key方法用JSON编码导出两个模型。

class RecipeManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Recipe(models.Model):
    objects = RecipeManager()

    name = models.CharField(max_length=255)

    def natural_key(self):
        return (self.name)


class LabelManager(models.Manager):
    def get_by_natural_key(self, recipe):
        return self.get(recipe=recipe)

class Label(models.Model):

    objects = LabelManager()

    recipe = models.OneToOneField(Recipe, primary_key=True)
    name = models.CharField(max_length=255)

    def natural_key(self):
        return self.recipe.natural_key()
    natural_key.dependencies = ['labels.recipe']

我使用自然键导出Label查询集:

with open(l_filename, 'w') as l_file:
    serialize('json',
              Label.objects.all(),
              indent=2,
              use_natural_foreign_keys=True,
              use_natural_primary_keys=True,
              stream=l_file)

一切正常但序列化的JSON对象没有他们应该引用的Recipe模型的字段。

[{"fields": {"name": null},"model": "labels.label"}]

Django docs,从1.7开始,没有给出任何与自然键一对一关系的提示。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

配方模型中的

名称字段不是唯一的。

自然键必须唯一才能识别对象。定义自然键时,django会在单个唯一字段或多个唯一字段上创建索引。

注意:

您用于自然键的任何字段都必须能够唯一标识一个对象。这通常意味着您的模型将为您的自然键中的一个或多个字段具有唯一性子句(在单个字段上为unique = True,或在多个字段上为unique_together)。但是,无需在数据库级别强制执行唯一性。如果您确定一组字段实际上是唯一的,则仍可以将这些字段用作自然键。