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,这是一对多的关系,所以我应该可以使用一个选项进行多个轮询。如果我尝试从夹具中加载它,就像这样:
[
{
"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."]
如何从灯具中加载多对一关系?
答案 0 :(得分:3)
以下是教程中的引用:
最后,请注意使用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."
}
}
希望有所帮助。
答案 1 :(得分:0)
抱歉,发布到一个旧线程,但是当我正在寻找一种使用固定装置创建关联模型而无需管理外键/主键/id 的方法时,我遇到了这篇文章。
Djanto 教程没有提到使用“自然键”,但它是让开发人员从管理外键/主键/id 中解放出来的好方法。
这个 StackOverflow 更直接地询问/回答自然键:Django: Create fixtures without specifying 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
这是未经测试的,但此问题中引用的民意调查/选择示例可能会使用这样的自然键(抱歉,我更喜欢 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 固定装置。