Сериализация натурального ключа модели Django с полем один к одному в качестве первичного ключа
У меня есть 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, не дает никаких намеков на отношения один-к-одному с естественными ключами. Любой совет?
0 ответов
Название поля в модели рецепта не является уникальным.
Природный ключ должен быть уникальным для идентификации объекта. Когда мы определяем естественные ключи, django создает индекс для одного уникального поля или нескольких уникальных полей вместе.
Замечания:
Какие бы поля вы не использовали для естественного ключа, он должен быть в состоянии однозначно идентифицировать объект. Обычно это означает, что ваша модель будет иметь предложение уникальности (уникальное =True для одного поля или уникальное для всех полей) для поля или полей в вашем естественном ключе. Тем не менее, уникальность не должна быть обеспечена на уровне базы данных. Если вы уверены, что набор полей будет фактически уникальным, вы все равно можете использовать эти поля в качестве естественного ключа.