Django 固定主键错误,需要自然键解决方案

标签 django django-models primary-key natural-key

所以我有一个电影模型,其中包含多对多领域的 Actor 模型列表:

class Person(models.Model):
    full = models.TextField()
    short = models.TextField()
    num = models.CharField(max_length=5)

class Film(models.Model):
    name = models.TextField()
    year = models.SmallIntegerField(blank=True)
    actors = models.ManyToManyField('Person')

我正在尝试从 json 装置加载一些初始数据,但是我遇到的问题是加载多对多 actor 字段。 例如我收到错误:

反序列化错误:[u“'Anna-Varney'值必须是整数。”]

使用这些装置:

  {
    "pk": 1,
    "model": "data.Film",
    "fields": {
      "actors": [
        "Anna-Varney"
      ],
      "name": "Like a Corpse Standing in Desperation (2005) (V)",
      "year": "2005"
    }

而我的 Actor 固定装置看起来像这样:

 {
    "pk": 1,
    "model": "data.Person",
    "fields": {
      "full": "Anna-Varney",
      "num": "I",
      "short": "Anna-Varney"
    }
  }

因此,多对多字段必须使用 pk 整数,但问题是数据未排序,并且对于一长串 Actor ,我认为手动查找每个 Actor 的 pk 不切实际。我一直在寻找解决方案,似乎我必须使用自然键,但我不确定如何将它们应用于我的模型。

编辑:我已将模型更改为:

class PersonManager(models.Manager):
    def get_by_natural_key(self, full):
        return self.get(full=full)

class Person(models.Model):
    objects = PersonManager()
    full = models.TextField()
    short = models.TextField()
    num = models.CharField(max_length=5)
    def natural_key(self):
        return self.full

但我仍然遇到同样的错误

最佳答案

输入和 natural_key 方法都有问题。

Documentation: Serializing Django objects - natural keys状态:

A natural key is a tuple of values that can be used to uniquely identify an object instance without using the primary key value.

Person natural_key 方法应返回一个元组

def natural_key(self):
    return (self.full,)

序列化输入还应包含自然键的元组/列表。

{
    "pk": 1, 
    "model": "data.film", 
    "fields": {
        "actors": [
            [
                "Matt Damon"
            ], 
            [
                "Jodie Foster"
            ]
        ], 
        "name": "Elysium", 
        "year": 2013
    }
}

关于Django 固定主键错误,需要自然键解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18167683/

相关文章:

django - 新手在 pycharm 中使用 South 时遇到困难 - DatabaseError : no such table: south_migrationhistory

ajax - Django API 请求

python - 网络音频播放器需要一些时间才能播放歌曲

sql-server - 主键上的索引名称

database - 关系的候选键的最小数量?

javascript - 使 jquery 灯箱工作

mysql - select_for_update 在解锁后是否会看到另一个 select_for_update 事务添加的行?

Django 向 GROUP BY 子句添加一个额外的字段

python - 在 Django 框架中匹配两个配置文件

ruby-on-rails - 不使用主键查找帖子