Как получить имя внешнего поля в Django Rest Framework
У меня есть 2 модели одна для пользователя, другая для связанных файлов пользователя
Models.py
class IndividualUser(models.Model):
membership_id = models.CharField(primary_key=True, max_length=100, default=1)
profile_image = models.ImageField(blank=True, upload_to ="individual_member_profile/", null=True)
firstname = models.CharField(max_length=100)
lastname = models.CharField(max_length=100)
class MemberCatalogue(models.Model):
membership_id = models.ForeignKey(IndividualUser, default=None,on_delete=models.CASCADE, related_name="member_catalogue")
files = models.FileField(upload_to="individualmembercatalogue/")
В настоящее время я получаю абсолютный путь для files
. Мне нужно имя файла, загруженного пользователем, для которого я пытаюсь получить поле "files", а затем разделить его с помощью "/". Но я не могу получить поле files из MemberCatalogue.
На данный момент мои сериализаторы выглядят следующим образом:
class MemberCatalogueSerializer(serializers.ModelSerializer):
files = serializers.FileField()
class Meta:
model = MemberCatalogue
fields = ['id','membership_id', 'files']
class IndividualMembersSerializer(serializers.ModelSerializer):
member_catalogue = MemberCatalogueSerializer(many=True)
filename = serializers.SerializerMethodField('get_filename')
def get_filename(self, obj):
return obj.individualmember.files
class Meta:
model = IndividualMembers
fields = "__all__"
Но я не могу получить желаемый результат. Ожидаемый результат выглядит как
{
"membership_id": "142369ca1b1484d8d9d6d87fdc8543db",
"member_catalogue": [
{
"id": 156,
"membership_id": "142369ca1b1484d8d9d6d87fdc8543db",
"files": "http://127.0.0.1:8000/individualmembercatalogue/some_file.pdf"
"filename" : "some_file.pdf"
}
],
"profile_image": null,
"firstname": "John",
"lastname": "Doe",
}
Вы используете неправильную модель в вашем IndividualMembersSerializer
.
Я думаю, вы пытаетесь изменить способ отображения имени файла в неправильном сериализаторе, поскольку файлы - это поле в MemberCatalogue
, а не в IndividualUser
.
Вот как бы я это сделал:
class MemberCatalogueSerializer(serializers.ModelSerializer):
filename = serializers.SerializerMethodField()
def get_filename(self, obj):
return str(obj.files).split('/')[1]
class Meta:
model = MemberCatalogue
fields = ['id','membership_id', 'files', 'filename']
class IndividualMembersSerializer(serializers.ModelSerializer):
member_catalogue = MemberCatalogueSerializer(many=True)
class Meta:
model = IndividualUser
fields = "__all__"
class MemberCatalogueSerializer(serializers.ModelSerializer):
filename = serializers.SerializerMethodField()
class Meta:
model = MemberCatalogue
fields = ['membership_id', 'files','filename']
def get_filename(self, obj):
return obj.files.url.split('/')[-1]