【问题标题】:Bisect queryset around another model's queryset围绕另一个模型的查询集平分查询集
【发布时间】:2009-01-15 11:49:59
【问题描述】:

我正在编写一个用户驱动的应用程序,其中包含多个区域。我希望允许用户自定义他们的消息设置,以便他们只收到有关他们关心的部分和操作的电子邮件。我拟定了以下Class

class EmailSetting(models.Model):
    user = models.ForeignKey(User, related_name="%(class)s_related_user")
    key = models.CharField(max_length=50)
    value = models.BooleanField()

这将由名为get_users(key, default) 的方法使用,该方法应该返回用户列表。例如,如果我询问在key="new_post", default=False 上被替换的用户列表,我应该得到一个用户列表,其中他们有一个EmailSetting,该键的值为True。这很简单,因为我可以使用 EmailSetting 模型。

如果默认值为 True,则事情似乎更难。我从来没有做过比模型的基本查找更复杂的事情,所以我需要帮助。

从完整的用户列表中,我需要删除带有 False EmailSetting 的用户。没有在 EmailSetting 上进行另一个查询以查找 False 条目并迭代地将它们从第一个查询集中删除,我看不出如何做到这一点......

...但是必须有另一种方式,因为那很臭。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    这就是我的做法:

    def get_users(key, default):
        if not default:
            return [es.user for es in EmailSetting.objects.filter(key = key, value = True)]
        return User.objects.exclude(pk__in = [es.user.pk for es in EmailSetting.objects.filter(key = key, value = False)])
    

    想想就觉得非常简单!有时一定会喜欢 Python 语法 =)

    【讨论】:

      【解决方案2】:

      我在用户字段中更改了您的相关名称,因为我认为您不想引用名称中带有“用户”的 EmailSetting。

      def get_users(key, default):
          if default:
              return User.objects.exclude(emailsetting__key=key, emailsetting__value=False)
          else:
              return User.objects.filter(emailsetting__key=key, emailsetting__value=True)
      

      【讨论】:

      • 您能发布一下您是如何更改 EmailSetting 类的吗?我已经从它的末尾删除了 _user 并重置了 SQL,但是我得到了 FieldError: Cannot resolve keyword 'emailsetting' into field。输入错误。
      • 你应该可以删除它:“user = models.ForeignKey(User)”。
      猜你喜欢
      • 2018-12-04
      • 2015-04-20
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多