我正在写一个django(1.10)网站并使用allauth进行授权。我不想在django中扩展用户模型 - 因为allauth为已经看似复杂的过程增加了一层复杂性。
我想创建一个模型(Custom UserManager?),它将具有以下方法:
注意:未过期的订阅是由其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的其他应用程序(在我的项目中)造成严重破坏。 makemigrations
和migrate
始终关注不一致的迁移历史记录
答案 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)