Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87

Direct assignment to the forward side of a many-to-many set is prohibited

06.06.2023, 16:38. Показов 2821. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста, что с моим тестом не так? Я уже пробовала по-разному, но не выходит.
Ошибки разные были.
Direct assignment to the forward side of a many-to-many set is prohibited. Use products.set() instead.
404 != 200 : Couldn't retrieve content: Response code was 404 (expected 200)
False is not true. Couldn't find 'myprofile_app.Product.None' in responce.
Разные ошибки, потому что я уже по всякому пробовала, поэтому советы на счет перевода ошибок пожалуйста не предлагать)

Сам тест:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ProfileAboutViewTestCase(TestCase):
    fixtures = [
        'myprofile-fixtures.json'
    ]
 
    @classmethod
    def setUpClass(cls):
        cls.user = User.objects.create(username="User_test", password="qwerty")
 
    @classmethod
    def tearDownClass(cls):
        cls.user.delete()
 
    def setUp(self) -> None:
        self.client.force_login(self.user)
        prod = Product.objects.all()
        self.profile = Profile.objects.create(
            user=self.user,
            balance=5555,
            products=prod.values_list("name", flat=True)
        )
 
        self.profile.save()
 
    def tearDown(self) -> None:
        self.profile.delete()
 
    def test_profile_details(self):
        response = self.client.get(reverse("myprofile_app:profile_details"))
        self.assertContains(response, "User_test")
        self.assertContains(response, "5555")
        self.assertContains(response, self.profile.products)
Модели:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default=None)
    balance = models.DecimalField(default=0, max_digits=8, decimal_places=2)
    products = models.ManyToManyField('Product', related_name='products')
    proposition = models.ForeignKey('Proposition', on_delete=models.CASCADE, default=None, blank=True, null=True)
 
    def __str__(self):
        return self.user.username
 
    def get_proposition(self):
        return self.proposition.name
 
 
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(default=0, max_digits=8, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    promotion = models.ForeignKey('Promotion', on_delete=models.CASCADE, default=None, blank=True, null=True)
 
    def __str__(self):
        return self.name
 
    def get_promotion(self):
        return self.promotion.name
View:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class ProfileCreateView(CreateView):
    model = Profile
    fields = "balance", "products"
    success_url = reverse_lazy("myprofile_app:profile_details")
 
    def get(self, request, *args, **kwargs):
        if self.request.user.is_authenticated and self.request.user.id in Profile.objects.values_list('user_id',
                                                                                                      flat=True):
            return redirect(reverse_lazy(
                "myprofile_app:update",
                kwargs={
                    "pk": self.request.user.id
                }, ))
        elif self.request.user.is_authenticated and self.request.user.id not in Profile.objects.values_list('user_id',
                                                                                                            flat=True):
            form = PartialProfileForm(request.POST)
            return render(request, 'myprofile_app/profile_form.html', {'form': form})
        else:
            return redirect(reverse_lazy("myprofile_app:login"))
 
    def form_valid(self, form):
        form.instance.user = self.request.user
        form.save()
        return super().form_valid(form)
 
class ProfileAboutView(LoginRequiredMixin, TemplateView):
    template_name = "myprofile_app/profile_details.html"
    model = Profile
    form_class = ProfileForm
    success_url = reverse_lazy("myprofile_app/profile_details.html")
 
    def get(self, request, *args, **kwargs):
        if self.request.user.is_authenticated and self.request.user.id in Profile.objects.values_list('user_id',
                                                                                                      flat=True):
            promotion_cache_key = f'promotion: {request.user.username}'
            proposition_cache_key = f'proposition: {request.user.username}'
            promotions = Product.get_promotion
            propositions = Profile.get_proposition
            user_cache_data = {
                promotion_cache_key: promotions,
                proposition_cache_key: propositions
            }
            cache.set_many(user_cache_data)
 
            return render(request, 'myprofile_app/profile_details.html', context={
                'promotion': promotions,
                'proposition': propositions
            })
        elif self.request.user.is_authenticated and self.request.user.id not in Profile.objects.values_list('user_id',
                                                                                                            flat=True):
            return HttpResponseRedirect(reverse_lazy("myprofile_app:create"))
        else:
            return render(request, 'myprofile_app/login.html')
 
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, instance=request.user.profile)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse_lazy("myprofile_app/profile_details.html"))
 
        return render(request, self.template_name, {'form': form})
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.06.2023, 16:38
Ответы с готовыми решениями:

Error F2515: left side of assignment illegal
Попробовал скомпелировать программку - выдал ошибку error F2515: left side of assignment illegal Что делать?

Ошибка invalid assignment left-hand side
Есть небольшой код, на который выдается такая ошибка. Погуглила, но в большенстве случаев эта проблема появляется либо из-за =/==/=== ,...

The function call on the left side of assignment must return variant objects
Помогите пожалуйста! Я учитель, и делаю игру в стиле 100 к 1 для класса. Тема - Борис Годунов Пушкина, чтобы проверить их уровень знаний...

14
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 03:09
Цитата Сообщение от lena_torez Посмотреть сообщение
def setUp(self) -> None:
        self.client.force_login(self.user)
        prod = Product.objects.all()
        self.profile = Profile.objects.create(
            user=self.user,
            balance=5555,
        )
self.profile.save()
self.profile.products.add(prod.values_li st("name", flat=True))
Попробуй так
0
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 14:27  [ТС]
Привет. Спасибо за ответ. Но, к сожалению, ошибка Field 'id' expected a number but got <QuerySet []>.

Я так вроде пробовала. По-крайней мере такая ошибка тоже была(

Добавлено через 17 минут
Добавила * в строку. И теперь 404 статус код(
Python
1
2
3
4
5
6
7
8
9
10
    def setUp(self) -> None:
        self.client.force_login(self.user)
        prod = Product.objects.all()
        self.profile = Profile.objects.create(
            user=self.user,
            balance=5555,
        )
 
        self.profile.save()
        self.profile.products.add(*prod.values_list("name", flat=True))
0
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 14:42
Лучший ответ Сообщение было отмечено lena_torez как решение

Решение

Ага, проглядел
Смотри:
Python
1
self.profile.products.add(prod.values_list("name", flat=True))
тут мы в велью лист достаем "name", а нам нужен "id"
0
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 14:49  [ТС]
Вот по шагам, что должно происходить. В админке я создала пользователя, после логина, если профиля нет, а его у нас еще нет, открывается страница создания профиля. Туда вписываем инфу, и после создания профиля, перенаправляется на страницу профиля. Вот. и вот это надо протестить
Миниатюры
Direct assignment to the forward side of a many-to-many set is prohibited   Direct assignment to the forward side of a many-to-many set is prohibited   Direct assignment to the forward side of a many-to-many set is prohibited  

0
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 14:51
Ну ок, в чем тогда вопрос?
0
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 14:53  [ТС]
И твое исправление тоже не помогло( Ошибка та же. Field 'id' expected a number but got <QuerySet []>.

Добавлено через 28 секунд
Это скрины работы приложения. А вот тест к этому приложению проваливается, вот в чем вопрос)
0
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 14:55
self.profile.products.add(list(prod.valu es_list("id", flat=True)))
Так должно пройти
0
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 15:06  [ТС]
Python
1
2
3
4
5
6
7
    def test_profile_details(self):
        response = self.client.get(reverse("myprofile_app:profile_details"))
        self.assertEquals(response.status_code, 200)
        self.assertContains(response, "User_test")
        self.assertContains(response, "5555")
        for product in self.profile.products.all():
            self.assertContains(response, product.name)
Заработало вот так. Осталась одна беда. У меня еще есть интернационализация, пока я ее выключила. Но если включить, как раз и происходит ошибка 404. Как подправить reverse("myprofile_approfile_details") , чтобы переходило по ссылке http://127.0.0.1:8000/ru/myprofile/profile/. Я понимаю, можно просо ссылку вставить. А есть ли какая-то хитрость для reverse.

Добавлено через 31 секунду
двоеточие p сработало как смайлик)
0
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
07.06.2023, 15:18
Цитата Сообщение от lena_torez Посмотреть сообщение
поэтому советы на счет перевода ошибок пожалуйста не предлагать
Напрасно отказываетесь, ошибка это не рандомный набор буковок, а конкретное сообщение, и сообщение именно разработчику, что нетак и где нетак. В идеале, разбор ошибок и их стектрейсов должен осваиваться еще на этапе знакомства с основами языка, причем любого, тогда бы сэкономили кучу времен и своего и чужого
Цитата Сообщение от lena_torez Посмотреть сообщение
Direct assignment to the forward side of a many-to-many set is prohibited. Use products.set() instead
Тут прямым текстом говорится, что прямое присваивание полям many-to-many запрещено, используйте вместо этого метод products.set(). А в полном тексте должен был бы быть и указатель на конкретное место в коде.
Цитата Сообщение от lena_torez Посмотреть сообщение
Но, к сожалению, ошибка Field 'id' expected a number but got <QuerySet []>.
Потому что
Цитата Сообщение от lena_torez Посмотреть сообщение
Use products.set() instead.
Метод add добавляет в поле отдельные значения, set сразу загоняет целым QuerySet'ом

Цитата Сообщение от lena_torez Посмотреть сообщение
И теперь 404 статус код(
Крайне не информативная информация
Если код выше не менялся, то там только одно преполагаемое место
Цитата Сообщение от lena_torez Посмотреть сообщение
Python
1
response = self.client.get(reverse("myprofile_app:profile_details"))
Для начала как profile_details прописан в url.py?
1
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 15:30
https://www.technomancy.org/py... nslations/
1
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 22:11  [ТС]
kazak, спасибо за ответы. Я всегда изучаю ошибки, и поверьте стараюсь найти им решение. Но, к сожалению, именно методом set я так и не смогла воспользоваться, хотя пыталась. Если бы вы написали, как им в данном случае пользоваться, я бы была вам признательна.

Добавлено через 1 минуту
Onet1me, Спасибо вам) Воспользовалась немного другим методом) Но всё равно огромное вам спасибо)
0
60 / 44 / 18
Регистрация: 05.03.2019
Сообщений: 313
07.06.2023, 22:12
я бы не стал использовать set, так как его отличае от add в том, что если уже содержатся какие либо инстансы, они перетрутся.
Только я не понял, у тебя add так и не сработал?
0
1 / 1 / 0
Регистрация: 08.07.2022
Сообщений: 87
07.06.2023, 22:22  [ТС]
Нет, как раз add сработал, только со звездочкой.
Python
1
2
3
4
5
6
7
8
9
10
    def setUp(self) -> None:
        self.client.force_login(self.user)
        prod = Product.objects.all()
        self.profile = Profile.objects.create(
            user=self.user,
            balance=5555,
        )
 
        self.profile.save()
        self.profile.products.add(*prod.values_list("name", flat=True))
Python
1
2
3
4
5
6
7
8
9
10
11
    def tearDown(self) -> None:
        self.profile.delete()
 
    def test_profile_details(self):
        with translation.override('en'):
            response = self.client.get(reverse("myprofile_app:profile_details"))
        self.assertEquals(response.status_code, 200)
        self.assertContains(response, "User_test")
        self.assertContains(response, "5555")
        for product in self.profile.products.all():
            self.assertContains(response, product.name)
0
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
11.06.2023, 11:25
Цитата Сообщение от lena_torez Посмотреть сообщение
Если бы вы написали, как им в данном случае пользоваться, я бы была вам признательна.
Python
1
self.profile.products.set(prod.values_list("name", flat=True))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2023, 11:25
Помогаю со студенческими работами здесь

Ошибка The left-hand side of an assignment must be a variable, property or indexer в C#
Только начинаю учиться программированию и случилась такая ошибка. bool a; bool b; bool c; ...

'set' object doesn't support item assignment
Доброго времени суток. Не могу понять, что за ошибка, как исправить.. выдает в строке 5 при r == 0, c == 2, sym == 'B' def...

Ремонт Холодильник Акаi ARL2522MS side-by-side, доза фреона 600а
Холодильник AKAI side-by-side ARL 2522MS морозилка-180л/холодилка-341л.Серийный номер-BCOTDOE0300BA7790094 подскажите норму заправки...

Ремонт Х-к Teka NF660i side by side нет регулировки температуры в морозильнике
Не знаю,чей это клон,надо направление поиска неисправности узнать для того,чтобы холодильщика отправить на сабж В холодильной камере...

Холодильник BOSCH KFU 5750/03 (side by side), Подобрать компрессор
Вечер добрый. Подскажите какой компрессор должен стоять на Холодильнике BOSCH KFU 5750/03 (side by side), R-134a 170гр, или аналог не очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru