Использование поля метода сериализатора для доступа к информации FK
Я использую вложенный сериализатор DRF с возможностью записи для создания нескольких объектов одновременно :
class NestedDocumentLocationSerializer(WritableNestedModelSerializer):
# organisme_name = serializers.SerializerMethodField(source='organisme.nom')
nda = DocumentSerializer(allow_null=True, required=False)
kbis = DocumentSerializer(allow_null=True, required=False)
qualiopi = DocumentSerializer(allow_null=True, required=False)
rib = DocumentSerializer(allow_null=True, required=False)
contrat = DocumentSerializer(allow_null=True, required=False)
class Meta:
model = DocumentLocation
fields = ['location', 'nda', 'kbis', 'qualiopi', 'rib', 'contrat']
# extra_kwargs = {
# 'organisme_name': {'read_only': True}
# }
# def get_organisme_name(self, obj):
# return obj.location.organisme.nom
Часть создания работает отлично, но когда дело доходит до моего местоположения, отображается только ID :
{
"location": 2,
"nda": {
"id": 136,
"nom": "ça fonctionne ?",
"description": "ça fonctionne ?",
"chemin": "ça fonctionne ?",
"stockage_interne": false
},
"kbis": {
"id": 137,
"nom": "ça fonctionne ?",
"description": "ça fonctionne ?",
"chemin": "ça fonctionne ?",
"stockage_interne": false
},
"qualiopi": {
"id": 138,
"nom": "ça fonctionne ?",
"description": "ça fonctionne ?",
"chemin": "ça fonctionne ?",
"stockage_interne": false
},
"rib": {
"id": 139,
"nom": "ça fonctionne ?",
"description": "ça fonctionne ?",
"chemin": "ça fonctionne ?",
"stockage_interne": false
},
"contrat": {
"id": 140,
"nom": "ça fonctionne ?",
"description": "ça fonctionne ?",
"chemin": "ça fonctionne ?",
"stockage_interne": false
}
}
Итак, я хочу использовать SerializerMethodfield для получения нужной мне информации: название организации, телефон и email пользователя.
Вот модели:
class DocumentLocation(models.Model):
location = models.ForeignKey('location.Location', on_delete=models.SET_NULL, null=True)
nda = models.ForeignKey('document.Document', on_delete=models.SET_NULL, null=True, related_name="document_nda")
kbis = models.ForeignKey('document.Document', on_delete=models.SET_NULL, null=True, related_name="document_kbis")
qualiopi = models.ForeignKey('document.Document', on_delete=models.SET_NULL, null=True,
related_name="document_qualiopi")
rib = models.ForeignKey('document.Document', on_delete=models.SET_NULL, null=True, related_name="document_rib")
contrat = models.ForeignKey('document.Document', on_delete=models.SET_NULL, null=True,
related_name="document_contrat")
class Location(models.Model):
class Meta:
verbose_name_plural = 'locations'
organisme = models.ForeignKey(to=Organisme, on_delete=models.SET_NULL, null=True, related_name="organisme")
siret = models.IntegerField(null=True)
nda = models.IntegerField(null=True)
certification = models.ForeignKey(to="certification.Certification", on_delete=models.SET_NULL, null=True,
related_name="certification")
date_ouverture = models.DateField(default=datetime.date.today, null=True)
commentaire = models.TextField(null=True)
class Organisme(models.Model):
class Meta:
verbose_name_plural = 'organismes'
def __str__(self):
if self.nom is not None:
return self.nom
return "nom non définit"
nom = models.CharField(max_length=120, null=True)
utilisateur = models.OneToOneField('utilisateur.Utilisateur', null=True, on_delete=models.SET_NULL)
adresse = models.CharField(null=True, max_length=180)
code_postal = models.IntegerField(null=True)
ville = models.CharField(null=True, max_length=120)
pays = models.CharField(null=True, default='France', max_length=120)
site_web = models.URLField(null=True)
avatar = models.OneToOneField('compte.Avatar', null=True, on_delete=models.SET_NULL,
related_name='organismes')
telephone = models.IntegerField(null=True)
class Utilisateur(AbstractUser):
username = None
email = models.EmailField('adresse email', max_length=80, unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
Как вы можете видеть, я пытался использовать мое поле SerializerMethodfield, с параметром источника или без него, и мое def get_organisme_name
с разными попытками, но я продолжаю получать 'NoneType' object has no attribute 'nom'
Спасибо за помощь.