2013-07-29 2 views
5

Django учебник по 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."] 

Как я могу загрузить отношения «многие-к-одному» из светильник?

ответ

3

Вот цитата из учебника:

Finally, note a relationship is defined, using ForeignKey. That tells Django each Choice is related to a single Poll. Django supports all the common database relationships: many-to-ones, many-to-manys and one-to-ones.

Каждый 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." 
    } 
} 

Надежда, что помогает.

+0

Да, это помогло. То, что я пытался сделать, - это сделать отношение «многие ко многим», после того, как он изменил модель, она отлично работала с использованием синтаксиса [1, 2]. Я каким-то образом изменил отношение «много-к-одному» в моей голове. – henrikstroem

Смежные вопросы