Фильтр django для получения более одного пользователя в модели
Я создал приложение с реферальной системой, проблема в том, что я хочу, чтобы реферал видел другие модели своего реферального пользователя, скажем, для инвестиционной платформы, я хочу, чтобы реферал видел лиц, которые являются рефералами, основной счет (модель) и инвестиционный статус (модель).
модели
class TheMain(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
main_balance = models.IntegerField(default=0)
earning_balance = models.IntegerField(default=0)
def __str__(self):
return str(self.user)
реферал возвращает более одного пользователя
class Referral(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
referral_balance = models.IntegerField(default=0)
code = models.CharField(max_length=12, blank=True)
referred_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,
related_name="ref_by")
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.user.username}- {self.code}'
def get_reffered(self):
qs = Referral.objects.all()
my_refs = []
for reffered in qs:
if reffered.referred_by == self.user:
my_refs.append(reffered)
return my_refs
Theviews
referral = Referral.objects.get(user=request.user)
my_ref = referral.get_reffered()
refer_main = []
refer_invest =[]
for my in my_ref:
main = TheMain.objects.filter(user = my.user)
for ma in main:
refer_main.append(ma)
print(f'this is the mama {ma} and amount funded{ma.main_balance}'
)
оператор печати возвращает все указанные имена и суммы выплат
Quit the server with CTRL-BREAK.
this is the mama user1 and amount funded1100
this is the mama user2 and amount funded800
this is the mama user and amount funded400.
Проблема заключается в том, чтобы зациклить всех этих пользователей в шаблоне. Я получаю эту ошибку, когда использую цикл for loop
TypeError at /core/referral
'TheMain' object is not iterable
Request Method: GET
Request URL: http://localhost:8000/core/referral
Django Version: 3.2.3
Exception Type: TypeError
Exception Value:
'TheMain' object is not iterable
Exception Location: C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\django\template\defaulttags.py, line 167, in render
Python Executable: C:\Users\HP\AppData\Local\Programs\Python\Python39\python.exe
Python Version: 3.9.5
Python Path:
['C:\\Users\\HP\\Desktop\\brooker\\broker',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\DLLs',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\lib',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39',
'C:\\Users\\HP\\AppData\\Roaming\\Python\\Python39\\site-packages',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\win32',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\win32\\lib',
'C:\\Users\\HP\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\Pythonwin']
но когда он не в цикле, он возвращает только одно имя пользователя
Как и в исключении, 'TheMain' object is not iterable
. Вы ссылаетесь только на один объект TheMain, который не является ни списком, ни кверисетом.
Добавление ma
к контексту просто помещает один объект TheMain в контекст.
Вместо этого добавьте к контексту кверисет main
. Например, так
main = TheMain.objects.filter(user = my.user)
for ma in main:
refer_main.append(ma)
context = {
'ref': main
}
Подтверждая то, что я только что объяснил, я думаю, что именно переменная refer_main
должна быть в контексте.
Кроме того, я не думаю, что можно использовать вложенный цикл, который добавляет значения в контекст на каждой итерации. Вместо этого на каждой итерации добавляйте объекты в список. Затем добавьте этот список в контекст.
Наконец, почему ваш return render находится в блоке for loop
?