2017-07-14 31 views
0

我在寫一個django(1.10)網站並使用allauth進行授權。我不想在django中擴展用戶模型 - 因爲allauth爲已經看似複雜的過程增加了一層複雜性。django模型 - 獲取跨多個表的用戶數據

我想創建一個模型(自定義的UserManager?),將有以下幾種方法:

  1. get_all_subscriptions_for_user(用戶= specified_user)
  2. get_unexpired_subscriptions_for_user(用戶= specified_user)

注意:未過期的訂閱由end_date> today's 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) 

理想的一個片段,我想有一個自定義的用戶管理器,它可以在一個訪問數據庫獲取這些數據 - 但我不確定我是否可以擁有自定義用戶管理器,而無需使用自定義用戶模型。

[旁白]

我試圖避免使用自定義模式,因爲它造成十分嚴重的上有用戶爲FK的其他應用程序(在我的項目)的破壞。 makemigrationsmigrate總是與消息有關不一致的遷移歷史

回答

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') 
0

BARF試試這個:

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)