【问题标题】:optimal solution for filtering inherited django models过滤继承的django模型的最佳解决方案
【发布时间】:2013-07-30 22:51:04
【问题描述】:

我有一个通用场景,但为了便于回答,我将其具体化。

我有模型图像,其中包含名称、url、相机、格式、created_date、upload_date 等字段。 (这些是 EXIF 信息。本来希望将这些字段作为标签,但我担心它会变得太复杂。)

我有另一个模型文件,它有一个外键图像字段和一个外键用户字段。 (如果两个不同的用户拥有相同的图像,那么将有一个图像对象和两个文件对象用于指向该图像的用户。)

现在我需要执行两项任务。 1-找到用户拥有的所有不同的相机。 (或格式等) 2- 按特定相机过滤所有用户文件。

对于这种情况,我想不出更有效的架构。

非常感谢您的帮助。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您的文件模型实际上是一个自定义的多对多关系。我会在 Image 模型中使用 ManyToMany 到用户模型。

    class Image(models.Model):
       ...
       users = models.ManyToManyField(...)
    

    查询应该是这样的:

    a) 查找用户拥有的摄像头

    Image.objects.values('camera').filter(users=the_user_in_subject).distinct()
    

    b) 按相机过滤用户图像

    Image.objects.filter(users=the_user_in_subject, camera='camera type')
    

    此外,如果您的 File 模型还有其他字段,您可以使用 through 选项 https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

    【讨论】:

    • 感谢您的回复。记录另一个对象中的不同相机而不是每次都检查所有图像不是更好的主意吗?
    • 您不需要查询摄像头吗? :) 上面的查询集将产生一个带有单个连接的查询(涉及图像和 m2m 中间表)。将相机放在单独的模型上会在此之上添加一个额外的连接(到相机模型)。编辑:除非您当然希望相机本身具有属性!
    • 有两个任务。 1-它只是弄清楚用户拥有哪些相机。 2-还有一个是弄清楚她拥有特定相机的图像。相机没有额外的属性。我虽然将 (1) 保留在单独的列表中,并在添加新图像时对其进行更新,但这会提高效率。不是这样吗?
    • 所以每个图像都有一个相机字段。正如您所建议的,图像和用户具有多对多关系(通过文件)。为 User 也设置一个单机相机字段是个好主意吗?
    • 不,这会导致数据库中的信息重复。您可以使用 related_name docs.djangoproject.com/en/dev/topics/db/queries/… 从 User 模型访问相机(例如 user.images.values('camera').distinct() 假设 related_name='images')。请仔细阅读上面的链接,django 有一个详细、漂亮的文档!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多