3

我有一个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"}]

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

4

1 回答 1

-1

配方模型中的名称字段不是唯一的。

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

笔记:

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

于 2019-03-12T09:48:19.047 回答