Как добавить значение обратного поля в набор данных сериализатора django, часть 2 - PullRequest
0 голосов
/ 14 октября 2019

Ранее я задавал похожий вопрос: Как добавить значение обратного поля в набор данных сериализатора django

Но, как ни странно, то, что сработало для первой модели, не работает длясекунда. Вот мои модели:

class ae(models.Model):
    opp_own = models.CharField(max_length = 50)

class statement_line(models.Model):
    ae = models.ForeignKey(ae, on_delete=models.PROTECT)
    pay_date = models.DateField(null=True)
    approve_date = models.DateField()
    opp_name = models.CharField(max_length = 50)
    type = models.CharField(max_length = 10)
    document_number = models.CharField(null=True,max_length = 50,)
    ct_id = models.CharField(max_length = 50,validators=[
        RegexValidator(regex='^CT',
                       message='this didn\'t come from salesforce'
                       )])
    amt = models.FloatField()
    cur = models.CharField(default='USD',max_length = 3)

class draws(models.Model):
    ae = models.ForeignKey(ae, on_delete=models.PROTECT)
    draw_type = models.CharField(choices=[('incentive pay','incentive pay'),('recoverable draw','recoverable draw')], max_length = 50)
    amt = models.FloatField()
    usd_amt = models.FloatField()
    cur = models.CharField(choices=[('USD','USD'),('EUR','EUR'),('AUD','AUD'),('IND','IND'),('GBP','GBP')],default='USD', max_length = 3)
    owe_date = models.DateField()
    sl = models.ForeignKey(statement_line, on_delete=models.PROTECT, null = True)

Это прекрасно работает:

class drawsSerializer2(serializers.ModelSerializer):
    opp_own = serializers.SerializerMethodField()

    class Meta:
        model = draws
        fields = ['id','ae_id', 'ae','owe_date','draw_type','usd_amt','amt', 'opp_own']
        extra_kwargs = {
            'ae': {'write_only': True}        
        }

    def get_opp_own(self, obj):
        return obj.ae.opp_own
goods = draws.objects.filter(sl_id__isnull=True).order_by('-owe_date')
serializer = drawsSerializer2(goods,many=True)
serializer.data

Но необъяснимо, что это не так:

class statement_lineSerializer2(serializers.ModelSerializer):
    opp_own = serializers.SerializerMethodField()

    class Meta:
        model = statement_line
        fields = ['id','ae_id','ae','pay_date','opp_name','type','document_number','ct_id','amt','cur','opp_own']
        extra_kwargs = {
            'ae': {'write_only': True}        
        }

    def get_opp_own(self, obj):
        return obj.ae.opp_own

goods2 = statement_line.objects.filter(pay_date__isnull=True).order_by('-approve_date')
sl = ae_statement_lineSerializer2(goods2,many=True)
sl.data

Вместо этого я получаю это: AttributeError: Получена ошибка AttributeError при попытке получить значение для поля opp_own в сериализаторе ae_statement_lineSerializer2. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре statement_line. Исходный текст исключения был: у объекта «Statement_line» нет атрибута «opp_own».

Я не знаю, что на самом деле делает фоновая магия, и, вероятно, придется пролистать код, чтобы понять это. Это должно быть что-то глупо очевидное. Это что-то глупо очевидно? И теперь его увековечили в интернете на всеобщее обозрение. serializerMethodFields, вложенные сериализаторы;Каждый раз, когда мне приходится искать значение из чужой таблицы в django, у меня возникает приступ паники.

1 Ответ

0 голосов
/ 14 октября 2019

Я не знаю, единственная ли это проблема, но эта строка вызывает у вас проблемы:

ae = models.ForeignKey(ae, on_delete=models.PROTECT)

Это создает переменную класса ae, поэтому она не может видеть уровень модулякласс ae. Это одна из причин, по которой мы обычно называем классы со смешанным регистром, например StatementLine, и именуем переменные в случае змеи, например statement_line. См. PEP8 для стандартных рекомендаций.

Однако, если вы делаете это, просто убедитесь, что имя класса и имя поля не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...