使用 Django 中的包含过滤用户数据
Filter a user data using contains in Django
我有这个模型可以在 slug 中记录数据。用户与奖励模型有关系。我想做的是在包含过滤器中列出所有登录用户的 awards slug 字段数据,这样我就可以用它来过滤用户的数据。
注意 : SuccessfulTransactionHistory 模型字段 award 中保存的所有数据都是 slug 格式并且 SuccessfulTransactionHistory 模型与 award 和 user 没有外键关系
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)
在我的view.py
success_list = SuccessfulTransactionHistory.objects.filter(award__contains=request.user.award.slug).order_by('-date')
这是我的错误
'User' object has no attribute 'award'
``
你的User对象有很多奖励,因为你使用了ForeignKey。
关系是:一个奖项有一个用户,但是一个用户有一个或多个奖项(award_set是属性名称)。
解决方案?是的,当然,但取决于上下文。
1-如果用户只有一个奖励,可以用OneToOneField,你的逻辑没问题。
2- 如果用户可以拥有多个奖励,可能需要 2 个步骤。
第一步:获得所有奖励子弹:
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)
我有这个模型可以在 slug 中记录数据。用户与奖励模型有关系。我想做的是在包含过滤器中列出所有登录用户的 awards slug 字段数据,这样我就可以用它来过滤用户的数据。
注意 : SuccessfulTransactionHistory 模型字段 award 中保存的所有数据都是 slug 格式并且 SuccessfulTransactionHistory 模型与 award 和 user 没有外键关系
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)
在我的view.py
success_list = SuccessfulTransactionHistory.objects.filter(award__contains=request.user.award.slug).order_by('-date')
这是我的错误
'User' object has no attribute 'award'
``
你的User对象有很多奖励,因为你使用了ForeignKey。
关系是:一个奖项有一个用户,但是一个用户有一个或多个奖项(award_set是属性名称)。
解决方案?是的,当然,但取决于上下文。
1-如果用户只有一个奖励,可以用OneToOneField,你的逻辑没问题。
2- 如果用户可以拥有多个奖励,可能需要 2 个步骤。
第一步:获得所有奖励子弹:
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)