django模型 - 在多个表中获取用户数据

时间:2017-07-14 16:49:26

标签: django

我正在写一个django(1.10)网站并使用allauth进行授权。我不想在django中扩展用户模型 - 因为allauth为已经看似复杂的过程增加了一层复杂性。

我想创建一个模型(Custom UserManager?),它将具有以下方法:

  1. get_all_subscriptions_for_user(用户= specified_user)
  2. get_unexpired_subscriptions_for_user(用户= specified_user)
  3. 注意:未过期的订阅是由其end_date>的订阅定义的今天的约会。

    这是我的models.py下面的片段

    from django.db import models
    from django.contrib.auth.models import User
    #...
    
    class Subscription(models.Model):
        token = models.CharKey()
        start_date = models.DateTime()
        end_date   = models.DateTime()
        # other attributes
    
    
    class UserSubscription(models.Model):
        user = models.ForeignKey(User)
        subscription = models.ForeignKey(Subscription)
    
    
    
    # In view
    def foo(request):
        user = User.objects.get(username=request.user)
        # how can I implement the following methods:
        # get_all_subscriptions_for_user(user=specified_user)
        # get_unexpired_subscriptions_for_user(user=specified_user)
    

    理想情况下,我希望有一个自定义用户管理器,它可以在一次数据库中获取此数据 - 但我不确定我是否可以拥有自定义用户管理器而无需自定义用户模型。

    [[Aside]]

    我正在努力避免使用自定义模型,因为它会对用户作为FK的其他应用程序(在我的项目中)造成严重破坏。 makemigrationsmigrate始终关注不一致的迁移历史记录

2 个答案:

答案 0 :(得分:1)

您可以使用自定义Manager,因为您要获取相关模型,所以不需要UserManager

class UserSubscriptionManager(models.Manager):

    def for_user(self, user):
        return super(UserSubscriptionManager, self).get_queryset().filter(user=user)

    def unexpired_for(self, user):
        return self.for_user(user).filter(
            suscription__end_date__gt=datetime.date.today()  # import datetime 
        )

在你的模特中:

class UserSubscription(models.Model):
    user = models.ForeignKey(User)
    subscription = models.ForeignKey(Subscription)

    user_objects = UserSubscriptionManager()

这样您就可以在视图中执行链接过滤器,例如:

 unexpired_suscriptions = UserSubscription.user_objects().unexpired_for(
    user=request.user
 ).exclude(suscription__token='invalid token')

答案 1 :(得分:0)

试试这个:

response = []
user_sub = UserSubscription.objects.filter(user=user.pk)
for row in user_sub:
        subscription = Subscription.objects.get(pk=row.subscription)
        end_date = subscription.end_date
        if end_date > timezone.now():
             response.append(subscription)