代码之家  ›  专栏  ›  技术社区  ›  Shmuelt

模型内预取相关方法

  •  1
  • Shmuelt  · 技术社区  · 5 月前

    所以我有一个Django模型,它是其他几个模型的外键。我想在我的模型中添加一个方法,看看我的模型实例是否真的有任何相关的对象。两个问题:

    1. 我想用一个查询来实现这一点,但我不确定如何使用 prefetch_related 具有 self 我该怎么做?

    2. 有办法回去吗 True False 是否存在相关模型?例如,我应该先使用吗?(我似乎记得有一种“正确”的方法可以做到这一点,但已经有一段时间了,我可能还记得烧瓶。)

    代码示例:

    from django.db import models
    
    class Person(models.Model):
      # <fields>
    
      def has_device(self):
        # ***prefetch related phones and laptops***
        if self.phone_set.first() or self.laptop_set.first():
          return True
        return False
    
    class Laptop(models.Model):
      owner = models.ForeignKey(Person)
      # <fields>
    
    
    class Phone(models.Model):
      owner = models.ForeignKey(Person)
      # <fields>
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   Selcuk    5 月前

    按相反顺序回答您的问题:

    1. 规范的方法是使用 .exists() 查询:
    return self.phone_set.exists() or self.laptop_set.exists()
    
    1. 在一个查询中尝试这样做没有真正的意义,因为它们是不同的表。话虽如此,你可以试试 prefetch_related_objects 帮手:
    from django.db.models import prefetch_related_objects
    ...
        def has_device(self):
            prefetch_related_objects([self], "phone_set", "laptop_set")
            return self.phone_set.exists() or self.laptop_set.exists()