Как получить имя внешнего поля в 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]
Вернуться на верх