簡體   English   中英

使用 Django 中的包含過濾用戶數據

[英]Filter a user data using contains in Django

我有這個 model 可以在 slug 中記錄數據。 用戶與獎勵 model 有關系。 我想要做的是在包含過濾器中列出所有登錄用戶的獎勵 slug 字段數據,以便我可以使用它來過濾用戶的數據。

注意:SuccessfulTransactionHistory model 字段中保存的所有數據都是 slug 格式,SuccessfulTransactionHistory model 與獎項和用戶沒有外鍵關系

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'

 ``

您的用戶 object 有很多獎項,因為您使用 ForeignKey。
關系是:一個獎項有一個用戶,但一個用戶有一個或多個獎項(award_set 是屬性名稱)。
解決方案? 是的,當然,但取決於上下文。

1-如果用戶只有一個獎項,你可以使用OneToOneField ,你的邏輯是可以的。

2-如果用戶可以擁有多個獎項,可能需要2個步驟。

第 1 步:獲得所有獎勵蛞蝓:

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

其中award_slugs是slugs 列表。

第 2 步:獲取成功列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM