Почему я получаю нарушение ограничения ForeignKey - PullRequest
0 голосов
/ 30 августа 2018

Как видно ниже, у меня есть 2 модели, соединенные через посредническую модель, чтобы сформировать отношения ManyToMany. Проблема в том, что, когда я удаляю объект Tender в, получаю эту ошибку.

update or delete on table "tender_details_tender" violates foreign key constraint "user_account_company_tender_id_984ea78c_fk_tender_de" on table "user_account_companyprofile_assignedTenders"
DETAIL:  Key (id)=(1) is still referenced from table "user_account_companyprofile_assignedTenders".

Я подумал, что добавление on_delete = models.CASCADE в ForeighKeys (то есть в промежуточной модели) решит эту проблему, но, очевидно, нет.

class CompanyProfile(models.Model):
      assignedTenders = models.ManyToManyField(Tender, through='UsersTenders', related_name='UserCompanies')
      
      

# connects users to the tenders they match.		
class UsersTenders(models.Model):
    user = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE, related_name='userTenderLink')
    tender = models.ForeignKey(Tender, on_delete=models.CASCADE, related_name='userTenderLink')
    sent = models.BooleanField(default=False, blank=False)
    class Meta:
        unique_together = ("user", "tender")
        
        
class Tender(models.Model):
    tenderCategory = models.ManyToManyField(Category, blank=False)       #this field holds the tender category, e.g. construction, engineering, human resources etc.
    tenderProvince = models.ManyToManyField(Province, blank=False)       #this is the province the tender was a

Для чего это стоит, я знаю, что вызывает эту проблему, но я не знаю, как ее исправить. Проблема заключается в том, что изначально у меня был ManyToManyField в модели CompanyProfile без аргумента «through», так что, как вы можете себе представить, Django создал свою собственную промежуточную таблицу, которая называется «user_account_companyprofile_assignedTenders», как показано в ошибке. Позже я решил создать свою собственную модель-посредник (т. Е. UsersTenders), потому что мне нужно было дополнительное поле, поэтому я должен был добавить аргумент "through" в моем ManyToManyField (то есть 'assignTenders'). Это работало нормально, но старая промежуточная модель "user_account_companyprofile_assignedTenders" не удалялась автоматически, я предполагаю, что это произошло потому, что перед изменением было создано несколько отношений. Как я могу удалить "user_account_companyprofile_assignedTenders" без дестабилизации моего проекта.

1 Ответ

0 голосов
/ 30 августа 2018

Вы добавили on_delete после переноса базы данных? Если да, вы сделали миграцию после добавления on_delete?

Вы можете попытаться установить null = True для всех полей, а затем попытаться выяснить, какой внешний ключ вызывает проблемы.

BDW. когда вы устанавливаете пустое значение = True, это означает только то, что ваши поля формы не будут настаивать на заполнении этих полей для отправки.

...