gpt4 book ai didi

python - 亲子关系效率

转载 作者:太空宇宙 更新时间:2023-11-03 19:21:11 25 4
gpt4 key购买 nike

我的 Django 应用程序中有一个图像字段,但希望能够存储图像的修订版本,以便允许我按修订顺序显示列表。最好的方法是单独存储图像,然后与父图像建立“父”外键关系吗?例如:

class Image(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey(Image, null=True)
image = models.ImageField(upload_to='images')

如果没有父级 (null=True),则图像不得有任何修订。每个对象只能有一个父对象和一个子对象,但层数可能是无限的。

我不知道是否可以在不生成大量 SQL 查询的情况下遍历多个子层,这会使应用程序效率非常低。用 Django 对象来表示这一点的最佳方式是什么?例如,使用单独的“ImageRevision”对象来处理图层是否更好?

谢谢

最佳答案

我发现有两种方法可以有效地做到这一点:

  1. Image绑定(bind)到它所使用的模型,允许图像一对多:

    class Image(models.Model):
    obj = models.ForeignKey(MyModel, related_name='images')
    name = models.CharField(max_length=50)
    image = models.ImageField(upload_to='images')
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
    ordering = ['-created']
    get_latest_by = 'created'

    然后您可以通过以下方式获取最新版本:

    my_model_instance.images.latest()
  2. 按照您提到的方式创建一个 ImageRevision 模型,并将其与 Image 绑定(bind)。

    class Image(models.Model):
    name = models.CharField(max_length=50)

    class ImageRevision(models.Model):
    parent = models.ForeignKey(Image, related_name='revisions')
    image = models.ImageField(upload_to='images')
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
    ordering = ['-created']
    get_latest_by = 'created'

    然后,您可以通过以下方式获取最新版本:

    my_model_instance.image.revisions.latest()

第二种方法涉及对附加关系的附加查询(尽管您应该能够通过明智地使用 select_lated 来缓解这种情况),但其优点是能够与多个不同的关系一起使用模型,而第一种方法会将 Image 本质上绑定(bind)到一个模型。

关于python - 亲子关系效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com