2017-07-14 13 views
0

私はdjango(1.10)のWebサイトを作成し、allauthを使用して承認しています。私はdjangoでユーザモデルを拡張したくないのです。なぜなら、allauthはすでに複雑なプロセスに複雑さを加えるからです。djangoモデル - 複数のテーブルにまたがるユーザーデータを取得する

  1. get_all_subscriptions_for_user(ユーザー= specified_user)
  2. get_unexpired_subscriptions_for_user(ユーザー= specified_user)

次の方法があります

私は(カスタムのUserManager?)モデルを作成したいです注:期限切れの定期購読は、今日の日付のend_dateを持つ定期購読によって定義されます。

これは理想的には、私は、データベースへの1回の旅行でこのデータをフェッチすることができ、カスタム・ユーザー・マネージャを、持っていると思います

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) 

以下の私のmodels.pyの抜粋である - しかし、私はありませんカスタムユーザーモデルを持たずにカスタムユーザーマネージャを使用できるかどうかを確認してください。

[[脇]]

それがFKとしてユーザーを持っている(私のプロジェクトで)他のアプリケーションに大混乱を天下ので、私は、カスタムモデルを使用しないようにしようとしています。 makemigrationsmigrate一貫性のない移行の歴史についてのメッセージ

答えて

1

あなたは、関連するモデルを取得しているのでUserManagerを必要としない、カスタムManagerで行くことができます。

お使いのモデルで
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) 
関連する問題