从文件中确定模型实例 URL

Determine model instance from file URL

鉴于请求中的 URL 是针对已知静态文件的,我如何确定哪个模型实例引用了该文件

如果我有几个不同的 Django 模型,每个模型都有一个 ImageField,这些字段每个都知道如何在文件系统上存储相对路径:

# models.py

from django.db import models

class Lorem(models.Model):
    name = models.CharField(max_length=200)
    secret_icon = models.ImageField(upload_to='secrets')
    secret_banner = models.ImageField(upload_to='secrets')

class UserProfile(models.Model):
    user = models.ForeignKey(User)
    secret_image = models.ImageField(upload_to='secrets')

然后模板可以渲染这些图像,使用(例如)instance.secret_banner.url 属性。

当收到相同的请求时 URL,我想在视图中处理该请求:

# urls.py

from django.urls import path

from .views import StaticImageView

urlpatterns = [
    ...,
    path(settings.MEDIA_URL + 'secrets/<path:relpath>', StaticImageView.as_view(), name='static-image'),
]

因此StaticImageView.get方法将传递从URL解析的relpath参数。

那时我需要根据哪个实例为这个静态图像制作URL做更多的处理。

# views.py

from django.views.generic import View

class StaticImageView(View):

    def get(self, request, relpath):
        instance = figure_out_the_model_instance_from_url_relpath(relpath)
        do_more_with(instance)

我不知道如何编写 figure_out_the_model_instance_from_url_relpath 代码。

我如何使用该路径查找哪个模型和哪个实例生成了 URL

您可以从图像文件或图像的文件名中查询和获取实例。 首先从 relpath 中获取文件名,然后查询实例。

示例代码示例:

class StaticImageView(View):

    def get(self, request, relpath):
        fname = get_filename_from_relpath(relpath)
        instance = Lorem.objects.get(secret_icon=fname)
        
        do_more_with_instance(instance)

我假设您想要基于 secret_icon 图像。您可以根据需要进行更改。