Django调用相关模型queryset,如rails activerecord merge scop

2024-10-03 06:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有两个模型帐户和配置文件:

class Profile < ApplicationRecord
    belongs_to :account
    scope :age_upper, ->(age) { where("age > ?", age) }
end

class Account < ApplicationRecord
    has_one :profile
end

然后我们可以在Rails中进行帐户模型的查询,如下所示:

^{pr2}$

但对于Django:

class ProfileQuerySet(models.QuertSet):
    def age_upper(age):
        return self.filter(age__gt=age)

class Profile(models.Model):
    account = models.ForiegnKey('Account', on_delete=models.CASCADE)

    objects = models.Manager.from_queryset(ProfileQuerySet)()


class Account(models.Model):
    pass

我的问题是,我们是否可以使用Profile的过滤器age_upper来查询帐户,而不是像下面这样为Account重写另一个过滤器

class AccountQuerySet(models.QuertSet):
    def age_upper(age):
        return self.filter(profile__age__gt=age)

class Account(models.Model):
    objects = models.Manager.from_queryset(AccountQuerySet)()

Tags: 模型agemodelmodels帐户accountprofileupper
1条回答
网友
1楼 · 发布于 2024-10-03 06:19:13

在Rails中,不能使用一个模型的范围来查询另一个模型(至少在ActiveRecord中)。即使你能找到办法做到这一点,那也可能不是最好的办法。在

如果不想再次编写作用域或其他共享逻辑,可以使用类似的关注点:

# app/models/concerns/shared_scopes.rb
module SharedScopes
  extend ActiveSupport::Concern

  included do
    scope :age_upper, ->(age) { where("age > ?", age) }
  end
end

然后在需要这种行为的所有模型中包含此问题:

^{pr2}$

相关问题 更多 >