Добавление пользовательских пользователей с определенным атрибутом в список «друзья»

#django #django-queryset #django-filter #django-custom-user

#django #django-набор запросов #django-фильтр #django-пользовательский пользователь

Вопрос:

Я реализовал логику добавления пользователей в «список друзей» из всего списка пользователей.

models.py

 class VendorList(models.Model):
    users = models.ManyToManyField(User)
    current_user = models.ForeignKey(User, related_name='owner', on_delete=models.SET_NULL, null=True)

    @classmethod
    def add_vendor(cls, current_user, new_vendor):
        vendor, created = cls.objects.get_or_create(
            current_user=current_user
        )
        vendor.users.add(new_vendor)

    @classmethod
    def remove_vendor(cls, current_user, new_vendor):
        vendor, created = cls.objects.get_or_create(
            current_user=current_user
        )
        vendor.users.remove(new_vendor)
  

views.py

 class VendorListView(TemplateView):
    template_name = 'event/vendor_list.html'

    def get(self, request):
        #form = EventItemModelForm()
        users = User.objects.exclude(id=request.user.id)
        vendor = VendorList.objects.get(current_user=request.user)
        vendors = vendor.users.all()

        args = {
            #'form': form, 
            'users': users, 'vendors': vendors
        }
        return render(request, self.template_name, args)

def change_vendor_list(request, operation, pk):
    vendor = User.objects.get(pk=pk)
    if operation == 'add':
        VendorList.add_vendor(request.user, vendor)
    elif operation == 'remove':
        VendorList.remove_vendor(request.user, vendor)
    return redirect('/vendors/')
  

Это работает и предоставляет список всех пользователей, которых я могу добавить в список. Однако мне нужно отфильтровать этот «весь» список и отобразить только пользователей, у которых есть атрибут is_vendor (аналогичный is_staff).
Где я должен фильтровать пользователей, в моделях или представлениях? Я пытался

 vendors = vendor.users.filter(is_vendor=True)
  

что не работает.

Ответ №1:

Я узнаю, что существует список доступных вариантов для фильтрации. Вместо фильтрации is_vendor мне нужно использовать поставщика следующим образом:

 vendors = vendor.users.filter(vendor=True)