«Ограничение UNIQUE не выполнено по адресу: pharmcare_phase.id» в моем приложении Pharmcare. ⇐ Python
-
Anonymous
«Ограничение UNIQUE не выполнено по адресу: pharmcare_phase.id» в моем приложении Pharmcare.
В моем проекте есть приложение Django, над которым я сейчас работаю, под названием pharmcare, и я сталкиваюсь с уникальной проблемой ограничений всякий раз, когда хочу переопределить метод save() для вставки/сохранения total платеж, произведенный пациентом, чтобы фармацевт, создающий форму или обновляющий запись пациента, не выполнял математические вычисления вручную. Всякий раз, когда я использовал форму из CreateView в view.py, не переопределяя метод сохранения функцией, которую я создал динамически для решения математических задач, она выполняла свою работу отлично, но в панели администратора ответ там бы не появился. Однако, если бы я попытался использовать save() в моем models.py приложения, я получил бы эту ошибку. Если я удалю метод save() в модели, ошибка исчезнет, а это не то, чего я хочу, поскольку я хочу, чтобы он сохранялся в базе данных сразу же, как фармацевты закончили создание или изменение формы. Я использовал метод get_or_create, чтобы решить эту проблему, но он остается неудачным, и есть еще один вариант, который я не хочу использовать (поскольку я хочу, чтобы владелец сайта имел возможность удалить фармацевта/организатора, создающего запись, аналогичная записям, которые он/она создал) — это SET_NULL для функции on_delete внешнего ключа. Кстати, я использую базу данных PostgreSQL.
Вот моя фармацевтическая модель стола пациента:
класс Пациент(модели.Модель): Medical_charge = models.PositiveBigIntegerField(blank=True, null=True, verbose_name="выплаченная сумма (медицинские расходы, если таковые имеются)") примечания = models.TextField(null=True, Blank=True) фармацевт = models.ForeignKey( «Фармацевт», on_delete=models.SET_NULL, null=True, пусто=True) организация = модели.ForeignKey( 'leads.UserProfile', on_delete=models.CASCADE) пользователь = модели.ForeignKey( 'песни.Пользователь', on_delete=models.CASCADE) пациент = модели.ForeignKey( 'PatientDetail', on_delete=models.CASCADE, verbose_name='Сведения о пациенте') Medical_history = models.ForeignKey( «История лекарств», on_delete=models.CASCADE) итог = models.PositiveBigIntegerField(editable=True, пусто=True, null=True, verbose_name="Итого (автодобавление)") slug = models.SlugField(null=True, Blank=True) date_created = models.DateTimeField(auto_now_add=True) класс Мета: заказ = ['id', '-date_created'] защита __str__(сам): вернуть себя.пациент.первое_имя защита get_total_charge(self) -> int: всего = 0 # проверьте, есть ли дополнительные сборы, такие как цена на лекарства, которые будут добавлены # если да, то прибавьте к общей сумме медицинские расходы если само.медицинский_заряд: sum_charged = самостоятельная.пациент.консультация + самостоятельная.медицинская_плата итого += сумма_заряжено общая сумма возврата итого += самостоятельная.пациент.консультация общая сумма возврата # откуда ошибка def save(self, *args, **kwargs): «»» переопределяет метод сохранения для динамического сохранения общее количество и пул в базе данных всякий раз, когда form_valid() пациента проверил. """ self.total = self.get_total_charge() self.slug = slug_modifier() return super().save(self, *args, **kwargs) Мое мнение:
класс PatientCreateView (OrganizerPharmacistLoginRequiredMixin, CreateView): """ Обрабатывает цикл запрос-ответ, созданный администратором/фармацевтами для создания пациент""" имя_шаблона = 'pharmcare/пациенты/пациент-информация-создать.html' form_class = PatientModelForm # набор запросов = Patient.objects.all() защита get_queryset (сам): организация = self.request.user.userprofile пользователь = self.request.user если user.is_organizer или user.is_pharmacist: набор запросов = Пациент.объекты.фильтр( организация = организация) еще: набор запросов = Пациент.объекты.фильтр( фармацевт=пользователь.фармацевт.организация ) queryset = queryset.filter(pharmacist__user=user) вернуть набор запросов def form_valid(self, form: BaseModelForm) -> HttpResponse: пользователь = self.request.user форма = form.save(commit=False) форма.пользователь = пользователь форма.организация = пользователь.профиль пользователя форма.сохранить() # Patient.objects.get_or_create(pharmacist=user.pharmacist.organization) вернуть супер(PatientCreateView, self).form_valid(форма) защита get_success_url(self) -> str: returnverse('pharmcare:пациент-информация') Сообщение об ошибке из моей среды разработки:
Ошибка IntegrityError в /pharmcare/ Patient-info-create/ Ограничение UNIQUE не выполнено: pharmcare_phase.id Метод запроса: POST URL-адрес запроса: http://127.0.0.1:8000/pharmcare/people-info-create/ Версия Джанго: 4.2 Тип исключения: IntegrityError Значение исключения: Ограничение UNIQUE не выполнено: pharmcare_phase.id Расположение исключения: C:\Users\USER\Desktop\dj-tests\env\Lib\site-packages\django\db\backends\sqlite3\base.py, строка 328, при выполнении Вызывается во время: pharmcare.views.peoples.PatientCreateView. Исполняемый файл Python: C:\Users\USER\Desktop\dj-tests\env\Scripts\python.exe Версия Python: 3.12.0 Путь Python: ['C:\\Users\\USER\\Desktop\\dj-tests', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\python312.zip', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\DLLs', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\Lib', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312', 'C:\\Users\\USER\\Desktop\\dj-tests\\env', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\win32', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\win32\\lib', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\Pythonwin'] Время сервера: Сб, 30 дек 2023 18:02:51 +0000 Я также пытался использовать self.object, предоставленный Django CBV, и я пытался просмотреть предыдущие проблемы, связанные с моей проблемой здесь, в stackoverflow, но ни один из них не смог чтобы разобраться в моей проблеме, 80% из них использовали SET_NULL для своего внешнего ключа, чего я не хочу.
Пожалуйста, мне нужен ваш ответ по поводу выполнения этой работы, потому что это как бы затормозило мой прогресс в работе на целый день. Спасибо!
В моем проекте есть приложение Django, над которым я сейчас работаю, под названием pharmcare, и я сталкиваюсь с уникальной проблемой ограничений всякий раз, когда хочу переопределить метод save() для вставки/сохранения total платеж, произведенный пациентом, чтобы фармацевт, создающий форму или обновляющий запись пациента, не выполнял математические вычисления вручную. Всякий раз, когда я использовал форму из CreateView в view.py, не переопределяя метод сохранения функцией, которую я создал динамически для решения математических задач, она выполняла свою работу отлично, но в панели администратора ответ там бы не появился. Однако, если бы я попытался использовать save() в моем models.py приложения, я получил бы эту ошибку. Если я удалю метод save() в модели, ошибка исчезнет, а это не то, чего я хочу, поскольку я хочу, чтобы он сохранялся в базе данных сразу же, как фармацевты закончили создание или изменение формы. Я использовал метод get_or_create, чтобы решить эту проблему, но он остается неудачным, и есть еще один вариант, который я не хочу использовать (поскольку я хочу, чтобы владелец сайта имел возможность удалить фармацевта/организатора, создающего запись, аналогичная записям, которые он/она создал) — это SET_NULL для функции on_delete внешнего ключа. Кстати, я использую базу данных PostgreSQL.
Вот моя фармацевтическая модель стола пациента:
класс Пациент(модели.Модель): Medical_charge = models.PositiveBigIntegerField(blank=True, null=True, verbose_name="выплаченная сумма (медицинские расходы, если таковые имеются)") примечания = models.TextField(null=True, Blank=True) фармацевт = models.ForeignKey( «Фармацевт», on_delete=models.SET_NULL, null=True, пусто=True) организация = модели.ForeignKey( 'leads.UserProfile', on_delete=models.CASCADE) пользователь = модели.ForeignKey( 'песни.Пользователь', on_delete=models.CASCADE) пациент = модели.ForeignKey( 'PatientDetail', on_delete=models.CASCADE, verbose_name='Сведения о пациенте') Medical_history = models.ForeignKey( «История лекарств», on_delete=models.CASCADE) итог = models.PositiveBigIntegerField(editable=True, пусто=True, null=True, verbose_name="Итого (автодобавление)") slug = models.SlugField(null=True, Blank=True) date_created = models.DateTimeField(auto_now_add=True) класс Мета: заказ = ['id', '-date_created'] защита __str__(сам): вернуть себя.пациент.первое_имя защита get_total_charge(self) -> int: всего = 0 # проверьте, есть ли дополнительные сборы, такие как цена на лекарства, которые будут добавлены # если да, то прибавьте к общей сумме медицинские расходы если само.медицинский_заряд: sum_charged = самостоятельная.пациент.консультация + самостоятельная.медицинская_плата итого += сумма_заряжено общая сумма возврата итого += самостоятельная.пациент.консультация общая сумма возврата # откуда ошибка def save(self, *args, **kwargs): «»» переопределяет метод сохранения для динамического сохранения общее количество и пул в базе данных всякий раз, когда form_valid() пациента проверил. """ self.total = self.get_total_charge() self.slug = slug_modifier() return super().save(self, *args, **kwargs) Мое мнение:
класс PatientCreateView (OrganizerPharmacistLoginRequiredMixin, CreateView): """ Обрабатывает цикл запрос-ответ, созданный администратором/фармацевтами для создания пациент""" имя_шаблона = 'pharmcare/пациенты/пациент-информация-создать.html' form_class = PatientModelForm # набор запросов = Patient.objects.all() защита get_queryset (сам): организация = self.request.user.userprofile пользователь = self.request.user если user.is_organizer или user.is_pharmacist: набор запросов = Пациент.объекты.фильтр( организация = организация) еще: набор запросов = Пациент.объекты.фильтр( фармацевт=пользователь.фармацевт.организация ) queryset = queryset.filter(pharmacist__user=user) вернуть набор запросов def form_valid(self, form: BaseModelForm) -> HttpResponse: пользователь = self.request.user форма = form.save(commit=False) форма.пользователь = пользователь форма.организация = пользователь.профиль пользователя форма.сохранить() # Patient.objects.get_or_create(pharmacist=user.pharmacist.organization) вернуть супер(PatientCreateView, self).form_valid(форма) защита get_success_url(self) -> str: returnverse('pharmcare:пациент-информация') Сообщение об ошибке из моей среды разработки:
Ошибка IntegrityError в /pharmcare/ Patient-info-create/ Ограничение UNIQUE не выполнено: pharmcare_phase.id Метод запроса: POST URL-адрес запроса: http://127.0.0.1:8000/pharmcare/people-info-create/ Версия Джанго: 4.2 Тип исключения: IntegrityError Значение исключения: Ограничение UNIQUE не выполнено: pharmcare_phase.id Расположение исключения: C:\Users\USER\Desktop\dj-tests\env\Lib\site-packages\django\db\backends\sqlite3\base.py, строка 328, при выполнении Вызывается во время: pharmcare.views.peoples.PatientCreateView. Исполняемый файл Python: C:\Users\USER\Desktop\dj-tests\env\Scripts\python.exe Версия Python: 3.12.0 Путь Python: ['C:\\Users\\USER\\Desktop\\dj-tests', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\python312.zip', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\DLLs', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312\\Lib', 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python312', 'C:\\Users\\USER\\Desktop\\dj-tests\\env', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\win32', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\win32\\lib', 'C:\\Users\\USER\\Desktop\\dj-tests\\env\\Lib\\site-packages\\Pythonwin'] Время сервера: Сб, 30 дек 2023 18:02:51 +0000 Я также пытался использовать self.object, предоставленный Django CBV, и я пытался просмотреть предыдущие проблемы, связанные с моей проблемой здесь, в stackoverflow, но ни один из них не смог чтобы разобраться в моей проблеме, 80% из них использовали SET_NULL для своего внешнего ключа, чего я не хочу.
Пожалуйста, мне нужен ваш ответ по поводу выполнения этой работы, потому что это как бы затормозило мой прогресс в работе на целый день. Спасибо!