Назначение кверисета полю 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)