【问题标题】:Filter a user data using contains in Django使用 Django 中的 contains 过滤用户数据
【发布时间】:2021-11-17 23:26:17
【问题描述】:

我有这个模型可以在 slug 中记录数据。用户与奖励模型有关系。我要做的是在包含过滤器中列出所有登录用户的奖励 slug 字段数据,以便我可以使用它来过滤用户的数据。

注意:SuccessfulTransactionHistory模型字段award中保存的所有数据均为slug格式,SuccessfulTransactionHistory模型与award和用户没有外键关系

models.py

class Award(models.Model):
    admin = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='award_images')
    slug = models.SlugField(max_length=150, blank=True, null=True)
    about_the_award = models.TextField(blank=True, null=True)
    status = models.CharField(max_length=20, choices=STATUS_PUBLISHED, default='Closed')
    price = models.DecimalField(max_digits=3, default='0.5',  decimal_places=1, blank=True, null=True, validators = [MinValueValidator(0.1)])
    bulk_voting = models.CharField(max_length=20, choices=BULK_VOTING, default='Closed')
    amount = models.DecimalField(default=0.0, max_digits=19, decimal_places=2, blank=True,)
    results_status = models.CharField(max_length=20, choices=RESULTS_PUBLISHED, default='private')
    starting_date = models.DateTimeField()
    ending_date = models.DateTimeField()
    date = models.DateTimeField(auto_now_add=True)

class SuccessfulTransactionHistory(models.Model):
    nominee_name = models.CharField(max_length=120)
    transaction_id = models.CharField(max_length=120)
    award = models.CharField(max_length=120)
    amount = models.DecimalField(default=0.0, max_digits=19, decimal_places=2)
    status = models.CharField(max_length=120, null=True, blank=True)
    phone = models.CharField(max_length=120, null=True, blank=True)
    date = models.DateTimeField(auto_now_add=True)

在我看来.py

success_list = SuccessfulTransactionHistory.objects.filter(award__contains=request.user.award.slug).order_by('-date')
 

这是我的错误

'User' object has no attribute 'award'

 ``

【问题讨论】:

  • 您是否尝试过打印“请求”?

标签: python django django-models django-views django-forms


【解决方案1】:

您的 User 对象有很多奖励,因为您使用 ForeignKey。
关系是:一个奖项有一个用户,但一个用户有一个或多个奖项(award_set 是属性名称)。
解决方案?是的,当然,但取决于上下文。

1-如果用户只有一个奖励,你可以使用OneToOneField,你的逻辑没问题。

2- 如果用户可以拥有多个奖项,可能需要 2 个步骤。

第 1 步:获得所有奖励:

award_slugs = list(request.user.award_set.values_list('slug', flat=True))

award_slugs 是一个 slug 列表。

第 2 步:获取 success_list:

success_list = SuccessfulTransactionHistory.objects.filter(award__in=award_slugs)

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2013-08-08
    • 2013-02-16
    • 2015-11-27
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2011-08-16
    • 2018-05-10
    相关资源
    最近更新 更多