Ранее я задавал похожий вопрос: Как добавить значение обратного поля в набор данных сериализатора 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, у меня возникает приступ паники.