【问题标题】:check for existence and active state in django filter检查 django 过滤器中的存在和活动状态
【发布时间】:2016-06-20 14:09:06
【问题描述】:

有没有办法做一个组合过滤器来查看一个对象是否存在以及它是否存在是否处于活动状态?

试图找出用户是否存在类似模型实例,以及类似模型实例是否处于活动状态。

我正在使用它来更改初始 css 的显示。如果用户喜欢它,那么它将显示一个绿色的类似按钮或其他表示这一点的东西。 ajax 然后更新计数器/切换 css 类,视图创建一个喜欢或切换现有喜欢的状态。只是想知道是否有更简洁的方法来检查这种情况。

当前过滤/方法:

likes = article.articlelike_set.filter(is_active=1)
users_like = likes.filter(user=request.user)
user_liked_article = users_like[0].is_active if users_like.exists() else False

like 应用中的like/article 模型关系:

class BaseLike(models.Model):

    user = models.ForeignKey(User)
    created = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

    class Meta:

        abstract = True

class ArticleLike(BaseLike, models.Model):

    article = models.ForeignKey('article.Article')
    ....

文章型号:

class ArticleBaseFields(models.Model):

    created = models.DateTimeField(default=timezone.now)
    ...
    slug = models.SlugField(unique=1)

    class Meta:

        abstract = True

class Article(ArticleBaseFields,models.Model):

    body = models.TextField(max_length=5000)
    publisher = models.ForeignKey('userprofiles.ArticlePublisher', related_name="publisher") 
    #Publisher is a profile with a OneToOneField to auth.models User model
    ...

【问题讨论】:

  • 请提供更多上下文,例如不同模型上的字段,例如ArticleLikesUsers,以及它们是如何相互关联的。

标签: python django django-views django-orm django-filter


【解决方案1】:

由于您已经在is_active=1 上进行过滤,因此您无需稍后检查users_like[0].is_active,因为此时您只有所有活跃的喜欢。

另一种方法是首先获得用户的所有喜欢(理想情况下应该是 1 或 0

user_likes = article.articlelike_set.filter(user=request.user)

现在,首先您可以检查是否存在该用户的点赞:

user_likes.exists() # user has liked an article

或者,如果用户的活动喜欢存在或不存在:

user_likes.filter(is_active=1).exists() # user has liked an article and it is active

另外,如果您使用related_name,您的代码会看起来更漂亮:

 article = models.ForeignKey('article.Article', related_name='likes')

 # to filter on likes
 article.likes.filter(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多