5

djangoproject.com上的 Django 教程给出了这样的模型:

import datetime
from django.utils import timezone
from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')

    def __unicode__(self):
        return self.question

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days = 1) <= self.pub_date < now

    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length = 200)
    votes = models.IntegerField(default = 0)

    def __unicode__(self):
        return self.choice_text

Choice 使用 ForeignKey,这是一个多对一的关系,因此我应该能够将 Choice 用于多个 Poll。如果我尝试从固定装置加载它,如下所示:

[
    {
        "model": "polls.Poll",
        "pk": 3,
        "fields": {
            "question": "What time do you sleep?",
            "pub_date": "2013-07-29T10:00:00+00:00"
        }
    },
    {
        "model": "polls.Poll",
        "pk": 4,
        "fields": {
            "question": "What time do you get up?",
            "pub_date": "2013-07-29T10:00:00+00:00"
        }
    },
    {
        "model": "polls.Choice",
        "pk": 4,
        "fields": {
            "poll": [{"pk": 3}, {"pk": 4}],
            "choice_text": "10:00",
            "votes": 0
        }
    }
]

我收到此错误:

    DeserializationError: Problem installing fixture '/.../poll/polls/fixtures/initial_data.json': [u"'[{u'pk': 3}, {u'pk': 4}]' value must be an integer."]

或者:

{
        "model": "polls.Choice",
        "pk": 4,
        "fields": {
            "poll": [3, 4],
            "choice_text": "10:00",
            "votes": 0
        }
    }

我收到此错误:

DeserializationError: Problem installing fixture '/.../poll/polls/fixtures/initial_data.json': [u"'[3, 4]' value must be an integer."]

如何从夹具加载多对一关系?

4

2 回答 2

4

以下是教程中的一段话:

最后,请注意使用 ForeignKey 定义了一个关系。这告诉 Django 每个选项都与单个投票相关。Django 支持所有常见的数据库关系:多对一、多对多和一对一。

每个Choice都与单个相关,Poll并且您正在尝试将键列表传递给该Choice.poll字段。

但是,每个民意调查都可以与几个选择相关:

{
    "pk": 4, 
    "model": "polls.Choice", 
    "fields": {
        "votes": 0, 
        "poll": 2, 
        "choice_text": "Meh."
    }
}, 
{
    "pk": 5, 
    "model": "polls.Choice", 
    "fields": {
        "votes": 0, 
        "poll": 2, 
        "choice_text": "Not so good."
    }
}

希望有帮助。

于 2013-07-29T08:52:16.710 回答
1

抱歉,发布到旧线程,但是当我在寻找一种使用固定装置创建关联模型而不需要管理外键/主键/ID 的方法时,我遇到了这篇文章。

Djanto 教程没有提到使用“自然键”,但它是让开发人员从管理外键/主键/id 中解放出来的好方法。

这个 StackOverflow 更直接地询问/回答自然键:Django: Create fixtures without specified a primary key?

此 Django 文档记录了自然键功能: https ://docs.djangoproject.com/en/dev/topics/serialization/#topics-serialization-natural-keys

使用 Django 的dumpdata工具对带有自然键的固定文件进行逆向工程会很有帮助: https ://docs.djangoproject.com/en/dev/ref/django-admin/#cmdoption-dumpdata-natural-foreign

这是未经测试的,但是这个问题中引用的 polls/choices 示例可能会使用这样的自然键(抱歉,我更喜欢 YAML 并且可能已经简化了模型以突出显示重要部分):

- model: polls.Poll
  fields:
    question: What time do you sleep?
- model: polls.Poll
  fields:
    question: What time do you get up?

- model: polls.Choice
  fields:
    choice_text: 10:00
    owner:
      - What time do you sleep?
      - What time do you get up?

我希望这能让下一个来到这里寻找一种使用带有关联的 Django 固定装置的方法的人更容易。

于 2021-02-28T02:53:09.573 回答