【问题标题】:Django - Check if newer value exist for each item in querysetDjango - 检查查询集中的每个项目是否存在更新的值
【发布时间】:2016-11-22 09:45:14
【问题描述】:

我有一个模型来保存用户的反应,但我的反应类型很少 - 1、2、3、4。 用户可以对不同的值做出几次反应,我想将它们保存在数据库中。 这是我的模型(我使用的是通用外键,不确定是否重要)。

class Reaction(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True)
    date = models.DateTimeField("Reaction date", auto_now_add=True)
    content_type = models.ForeignKey(ContentType, verbose_name=_('content type'),
                                     related_name="content_type_for_%(class)s", on_delete=models.CASCADE)

    object_pk = models.TextField(_('object ID'))
    root_obj = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
    react = models.CharField('Reaction', max_length=10)

我想获取用户对特定反应(例如 2)做出反应的所有 root_obj(如果可能,则不同),而不是之后对 3,4 类型的反应做出反应。

有可能吗? 谢谢

R

【问题讨论】:

  • 你的意思是像Reaction.objects.filter(user=request.user, react='2').only('root_obj').distinct()这样的东西吗?
  • 我不这么认为。仅当之后没有对 react=3,4 的反应时,我才想获得 root_obj
  • 所以,在伪代码中,如果反应 = 2 并且同一用户没有反应 = 3 和反应 = 4,那么给我 root_obj。否则什么都不返回?
  • 几乎 - 如果反应 = 2 并且对于同一用户没有 later 反应 = 3 和反应 = 4,那么给我 root_obj。

标签: django django-models foreign-keys django-queryset


【解决方案1】:

我希望我这样做是正确的。看看它是否有效:

def view(request, object_pk):
query = Reaction.objects.filter(user=request.user, object_pk=object_pk) \
                        .only('react', 'date', 'root_obj')

try:                       
    react2 = query.get(react='2')
except:
    react2 = None

try:                       
    react3 = query.get(react='3')
except:
    react3 = None

try:                       
    react4 = query.get(react='4')
except:
    react4 = None

# Is there a reaction = 2 and not a reaction = 3 or 4?
if react2 and not react3 or not react4:
    return react2.root_obj

# Is there a reaction = 3 or 4 along with 2?
elif react2 and react3 or react4:

    if react3:

        if react2.date < react3.date:
            return react2.root_obj
        return None
    elif react4:

        if react2.date < react4.date::
            return react2.root_obj
        return None
return None

【讨论】:

  • 对不起,但我想我不够清楚......我需要他们最新反应为 2 的所有 root_obj。你的代码只返回所有 root_obj 的最新一起,对吗?跨度>
  • @Rani 不太清楚我是否关注我很抱歉。我的代码返回 root_obj 是他们的反应 = 2 并且最近没有反应等于 3 或 4。
  • 看起来您的代码返回单个 root_obj,但有时我可以找到多个满足这些条件的 root_obj。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2015-11-07
  • 2017-12-26
相关资源
最近更新 更多