Назначение кверисета полю M2M в Django приводит к тому, что объект "'ManyRelatedManager' не имеет атрибута 'category'".

# View

@require_POST
def update_category_filter(request):
    """
    Updates the Category filter
    """
    # User logged in?
    if request.user.is_authenticated:

        # Get the form instance
        filter_form = SelectCategoryForm(request.POST)

        # Form validation
        if filter_form.is_valid():

            # Check if user already has a filter instance
            instance_exists = UserCategoryFilter.objects.filter(user=request.user)

            # Get the cleaned data
            selection = filter_form.clean()
            print(selection)

            # If not create, else update
            if not instance_exists:
                filter_instance = UserCategoryFilter.objects.create(user=request.user)
                print(filter_instance)

                # Add each selected filter of queryset to model instance
                for member in selection:
                    filter_instance.categories_selected.category.add(member)    # breaks here 

selection - это чистый набор запросов, которым я хочу заполнить поле "многие ко многим". Однако это приводит к

У объекта 'ManyRelatedManager' нет атрибута 'category'

# Model

class UserCategoryFilter(models.Model):
    """
    Saves the selected category filter by a user
    """
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    categories_selected = models.ManyToManyField(Category)
# Form

class SelectCategoryForm(forms.Form):
    """
    A form to update category filters for logged in users
    """
    choices = forms.ModelMultipleChoiceField(queryset=Category.objects.all().order_by('category'),
                                             widget=forms.CheckboxSelectMultiple)

Как следует из ошибки, categories_selected является менеджером, поэтому для добавления категории нужно просто:

for member in selection:
    filter_instance.categories_selected.add(member)

или сделать это без цикла:

filter_instance.categories_selected.add(*member)
Вернуться на верх