2015-07-08 2 views
0

Я пытаюсь сделать Django Rest Framework вернуть мне отношение ко многим, построенное с ключевым словом through. Однако я получаю сообщение об ошибке и не знаю, что случилось.AttributeError при сериализации отношения с таблицей «через»

Ошибки я получаю:

Got AttributeError при попытке получить значение поля step_number на сериализаторе StepInfoSerializer. Поле сериализатора может быть названо неправильно и не соответствует никакому атрибуту или ключу на экземпляре Step. Исходный текст исключений: Объект «Шаг» не имеет атрибута «step_number» .

Вот моя модель:

class Step(BaseModel): 

    description = models.TextField(null=False, blank=False) 

class StepInfo(BaseModel): 

    recipe = models.ForeignKey('Recipe') 
    step = models.ForeignKey(Step) 
    step_number = models.IntegerField() 

class Recipe(BaseModel): 

    title = models.CharField(max_length=100) 
    steps = models.ManyToManyField(Step, through='StepInfo') 

И реализация сериализаторов:

class StepInfoSerializer(serializers.HyperlinkedModelSerializer): 

    description = serializers.CharField(source="step.description") 

    class Meta: 
     model = StepInfo 
     fields = ('id', 
        'step_number', 
        'description') 


class RecipeSerializer(serializers.HyperlinkedModelSerializer): 

    steps = StepInfoSerializer(many=True, read_only=True) 

    class Meta: 
     model = Recipe 
     fields = ('id', 
        'steps') 

Может кто-нибудь пролить свет на эту проблему? Я бы очень признателен! Спасибо!

ответ

1

самый простой способ изменить это изменить источник ваших шагов в RecipeSerializer

теперь я сделаю объяснение по этому поводу.

сначала, только в мире Django.

например, rec - объект экземпляра Recipe Модель.

Получите разницу в двух утверждениях.

rec.steps.all() 
rec.stepinfo_set.all() 

rec.steps.all() будет возвращает массив Step экземпляра объекта, убедитесь, что это целевая модель ManyToManyField, не через модели.

, если вы хотите получить доступ к через модели, вам необходимо посетить из related_name в ForeignKey относятся к текущей модели в рамках модели (StepInfo Model).

позже, я добавлю пример с родственным именем.

, так как в вашем StepInfo не указан related_name, поэтому django автоматически предоставит вам по умолчанию related_name stepinfo_set. (это имя является тем, что в первом фрагменте).

так что вернемся к тому, как пройти через экземпляры. только rec.setpinfo_set.all().

Хорошо, в конце концов, я предлагаю вам добавить родственное имя в свой ForeignKey в своих сквозных моделях.

class StepInfo(BaseModel): 

    recipe = models.ForeignKey('Recipe', related_name='stepinfos') 
    step = models.ForeignKey(Step, related_name='stepinfos') 
    step_number = models.IntegerField() 

class RecipeSerializer(serializers.HyperlinkedModelSerializer): 

    steps = StepInfoSerializer(many=True, read_only=True, source='stepinfos') 
+0

Это один из лучших ответов, который я когда-либо получал от переполнения стека. Я многому научился. Благодаря! – RaffAl

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