【问题标题】:Django : Create custom object list in the view and pass it to template to loop overDjango:在视图中创建自定义对象列表并将其传递给模板以循环
【发布时间】:2019-11-16 18:48:04
【问题描述】:

我想在视图中创建一个自定义对象列表并将其传递给模板。在模板中,我想遍历列表并显示信息。

我的模特是

class CustomUser(AbstractUser):
    def __str__(self):
        return self.email

class Post(models.Model):
    author = models.ForeignKey(CustomUser,on_delete=models.CASCADE,)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    post_url = models.URLField(max_length = 200, blank = True)
    slug = models.SlugField(unique=True, blank=True)

class subscription(models.Model):
    creator = models.ForeignKey(CustomUser,default=None, null=True,on_delete=models.CASCADE,related_name='creator',)
    booster = models.ForeignKey(CustomUser,default=None, null=True,on_delete=models.CASCADE,related_name='booster')
    sub_value = models.FloatField(blank = True)
    sub_id = models.TextField(blank = True)
    status = models.BooleanField(default=False)
    dateSubscribed = models.DateTimeField(default=timezone.now)
    dateSubscriptionEnded = models.DateTimeField(default=timezone.now)
    paymentCount = models.FloatField(default= 0)

我想从订阅模型中过滤对象,如下所示

subs = subscription.objects.filter(booster = request.user)

然后在上述 subs 对象列表中找到创建者,并为每个创建者获取名称、帖子数量和订阅者数量。将此添加到自定义列表并将其传递给模板以循环并显示模板中的信息。有人可以帮我如何创建这个自定义列表。谢谢!

【问题讨论】:

  • 如果你有CustomUser实例,你可以使用反向关系,因为你的关联名称是:request.user.creator.all(),我建议使用更相关的关联名称,例如creator = ...... related_name='created_subscriptions'
  • 模型中的订阅者信息在哪里?什么是创作者,什么是助推器,它如何与 Post 模型联系起来

标签: django django-templates django-views


【解决方案1】:

好的,这里是减去订阅者的基础知识,因为我看不清楚这种关系。这是解析名称和帖子数量的方法。 \

my_list = []

for sub in subs:
    name = sub.creator.name
    auth_id = sub.creator.id
    posts = Post.objects.filter(author=auth_id)
    num_of_posts = len(posts)
    my_list.append({
        'name':name,
        'post_count': num_of_posts,
    })

然后您将通过模板上下文传递 mylist。

【讨论】:

  • 谢谢,它对我有用。对于订阅者计数,我使用了以下代码订阅者 = subscription.objects.filter(creator = auth_id) num_of_subcribers = len(subscribers)
【解决方案2】:

将related_name=… parameter [Django-doc] 命名为与字段名称相同的值是一个常见错误。 related_name 参数是 Django 将自动添加的 reverse 关系的名称。所以这里它意味着访问的关系,例如给定CustomUser 的相关subscription 对象。

因此重命名这些更有意义,例如:

class Subscription(models.Model):
    creator = models.ForeignKey(
        CustomUser,
        default=None,
        null=True,
        on_delete=models.CASCADE,
        related_name='created_subscriptions'
    )
    booster = models.ForeignKey(
        CustomUser,
        default=None,
        null=True,
        on_delete=models.CASCADE,
        related_name='boosted_subscriptions'
    )
    sub_value = models.FloatField(blank=True)
    sub_id = models.TextField(blank =True)
    status = models.BooleanField(default=False)
    dateSubscribed = models.DateTimeField(default=timezone.now)
    dateSubscriptionEnded = models.DateTimeField(default=timezone.now)
    paymentCount = models.FloatField(default=0)

接下来我们可以查询哪里:

from django.db.models import Count

CustomUser.objects.filter(
    created_subscriptions__booster=request.user
).annotate(
    number_of_posts=Count('post', distinct=True)
)

这是CustomUsers 中的QuerySet,其中从QuerySet 产生的每个CustomUser 都有一个包含帖子数量的额外属性.number_of_posts。因此,您可以直接在模板中迭代查询集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2016-09-28
    • 2023-04-02
    相关资源
    最近更新 更多