蓝色:
如何使poc.poc_employer.add(新供应商)使用新供应商对象id?
背景:
在使用sqlite3开发本地计算机时,我对以下代码没有问题。在Heroku上部署到Postgres是我第一次遇到这个问题。
这个问题涉及两个相互参照的模型。首先是用来表示用户的公司以及用户的供应商公司的公司。第二种是POC,它在特定的供应商组织中存储用户POC的信息。
模型:
class Company(models.Model):
...
suppliers = models.ManyToManyField('self', db_index=True, symmetrical=True, related_name = "the_suppliers", blank = True)
POC = models.ManyToManyField('Supplier_POC', db_index=True, symmetrical=True, blank = True)
...
def __str__(self):
return self.company_name
class Supplier_POC(models.Model):
poc_employer = models.ManyToManyField('Company', symmetrical=True, blank = True)
poc_name = models.CharField(blank=True, null=True, max_length=200)
poc_phone = models.CharField(blank=True, null=True, max_length=200)
poc_email = models.EmailField(blank=True, null=True, max_length=200)
用户情景包括某人通过在表单中输入供应商名称、poc名称、poc电话和poc电子邮件,并提交,将供应商添加到其公司的批准供应商列表中。然后,视图获取或创建supplier对象,将其添加到用户的company对象,创建POC对象,并将supplier作为POC_employee添加到POC对象。在下面的代码中,供应商不存在并且必须被创建。
视图:
#Create and add supplier to Company table as non-member
new_supplier = Company(company_name = supplier, company_domain = domain, member = False)
new_supplier.save()
#Add new supplier to user company's supplier list. No issues with this.
new_supplier = Company.objects.get(company_name__iexact = supplier)
company.suppliers.add(new_supplier)
#Save POC to poc table. No issues with this.
if phone != "" :
poc = Supplier_POC( poc_name=name, poc_phone = phone, poc_email = email )
else:
poc = Supplier_POC( poc_name=name, poc_phone = "", poc_email = email )
poc.save()
#Add new_supplier to poc object. Here's the trouble spot
try:
poc.poc_employer.add(new_supplier)
except Exception as e:
print('error trying to add supplier to poc object')
print(e)
Heroku日志中的错误:
在表“supplyhelix_supply poc_poc_poc_emply”中插入或更新违反外键约束“supplyhelix_company_19a07677e7b462d_fk_supplyhelix_company_id”
详细信息:键(公司id)=(11)不在表中
“supplyhelix_公司”。
对于我在Stackoverflow上看到的其他类似问题,解决方法只是没有创建和/或保存要添加的对象。如您在视图中所见,该对象已创建并保存,并且在尝试添加到POC对象时出错之前,它已成功添加到用户的公司对象中。
我已经打印了新的供应商对象的id几次,以比较上面的错误详细信息,但它们不匹配。例如,产生上述错误的特定测试new_supplier.id是14,但是add显然是在寻找id=11,而我之前已经从数据库中删除了这个id=11。
不知道为什么,但据我所知,poc.poc_employer.add(new_supplier)只是使用一个自动递增的id,每次尝试向poc添加一个供应商对象时,该id都会递增1。
我知道这很长。非常感谢你读到这里!我真的很感谢你的时间和你可能给我的任何反馈/帮助。
最佳答案
我会考虑重做你的模型。看起来你是在用公司模式来做公司和供应商。我知道供应商是一家公司,但如果你对他们的态度不同,最好把他们分开。你可以让公司成为一个基本模式,让供应商和雇主从中继承。
就你的模特而言,我会考虑把它们写成:
class Company(models.Model):
company_name = ...
...
class Employer(Company):
suppliers = models.ManyToManyField('Supplier', db_index=True, related_name="employers", blank=True)
class Supplier(Company):
...
class POC(models.Model):
name = models.CharField(blank=True, null=True, max_length=200)
phone = models.CharField(blank=True, null=True, max_length=200)
email = models.EmailField(blank=True, null=True, max_length=200)
...
class SupplierPOC(POC):
supplier = models.ForeignKeyField('Supplier', blank=True)
对于你的观点,我会考虑这样写:
#Create and add supplier to Company table as non-member
new_supplier = Supplier(company_name=supplier_name, company_domain=domain, member=False)
new_supplier.save()
#Add new supplier to user company's supplier list. (I wouldn't use names. Instead use id's.)
new_supplier = Supplier.objects.get(company__id=supplier.id)
employer.suppliers.add(new_supplier)
#Save POC to poc table.
poc = SupplierPOC(supplier=new_supplier, name=name, phone=phone, email=email)
poc.save()
忽略所有这些,您的
if phone != "" :
块中没有保存,这意味着poc不会被保存或添加。关于django - Django Postgres循环多边引用-在表上插入或更新违反外键约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37331245/