Фильтр 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?

Вернуться на верх