Модели имеют такое отношение:
class ShoppingList(models.Model):
(...)
config_file = models.FileField(upload_to=upload_config_file)
class FetchedData(models.Model):
(...)
config_id = models.ForeignKey(ShoppingList, on_delete=models.CASCADE, default=0)
def config_link(self):
return self.config_id.config_file
Затем в serializers.py
:
class FetchedDataSerializer(serializers.ModelSerializer):
file_link = serializers.SerializerMethodField()
class Meta:
model = FetchedData
fields = ('config_id', 'file_link')
def get_file_link(self, obj):
return obj.config_link()
Проблема в том, что когда я получаю ответ, файлы представляются как их содержимое, поэтому в случае файлов JSON я получаю что-то вроде:
{
"config_id": "4544",
"file_link": [
"{\r\n",
" \"glossary\": {\r\n",
" \"title\": \"example glossary\",\r\n",
"\t\t\"GlossDiv\": {\r\n",
" \"title\": \"S\",\r\n",
"\t\t\t\"GlossList\": {\r\n",
" \"GlossEntry\": {\r\n",
" \"ID\": \"SGML\",\r\n",
"\t\t\t\t\t\"SortAs\": \"SGML\",\r\n",
"\t\t\t\t\t\"GlossTerm\": \"Standard Generalized Markup Language\",\r\n",
"\t\t\t\t\t\"Acronym\": \"SGML\",\r\n",
"\t\t\t\t\t\"Abbrev\": \"ISO 8879:1986\",\r\n",
"\t\t\t\t\t\"GlossDef\": {\r\n",
" \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\r\n",
"\t\t\t\t\t\t\"GlossSeeAlso\": [\"GML\", \"XML\"]\r\n",
" },\r\n",
"\t\t\t\t\t\"GlossSee\": \"markup\"\r\n",
" }\r\n",
" }\r\n",
" }\r\n",
" }\r\n",
"}"
]
}
Что сделать, чтобы вместо этого получать только ссылку на местоположение файла?
В вашем определении метода config_link
вы возвращаете связанный config
file
, который на самом деле является самим файловым объектом.
Вместо этого вы должны вернуть URL-адрес файла, который является свойством файла url
:
def config_link(self):
return self.config_id.config_file.url