我使用的是Django Rest框架。我使用这个建议在auto-suggestSelect2 dropdown but allow new values by user?中添加新值。但对我来说这几乎是不可能的。在
收款人是外键字段。如果返回的是字符串和“(NEW)”而不是主键,我需要在联系人模型中创建对象,并将新创建对象的主键设置为payee字段。在
在模型.py在
class Contacts(models.Model):
no = models.AutoField(primary_key=True)
name = models.CharField(max_length=25)
class Transactions(models.Model):
payee = models.ForeignKey(Contacts,null=True, related_name = 'transactions_payee')
reminder = models.ForeignKey(Reminders, related_name='transaction_reminders',blank=True, null=True)
在序列化程序.py在
^{pr2}$甚至没有调用validate_payee。我甚至尝试在create()中添加相同的逻辑,但django的默认验证器在这之前出现,并抛出错误消息说
{payee: ["Incorrect type. Expected pk value, received unicode."]}
我是Django的初学者。我搜索了几乎所有的stackoverflow问题。没有什么对我有用,或者我在某个地方犯了个错误。在
解决方案1
发生上述错误是因为TransactionSerializer将字段“payee”作为 ForeignKeyField(就像PK)。在
所以当调用validate_payee方法而不是返回PK值时, 返回的是unicode字符串。在
我想你是想把valdiate_payee中的收款人作为一个实例 收款人模式。在
如果这是您想要的,那么我的建议是更新TransactionSerializer并尝试添加以下行之一:
^{pr2}$执行上述操作时,请确保validate_payee函数返回 联系。在
如果验证不正常,只需引发ValidationError(http://www.django-rest-framework.org/api-guide/exceptions/#validationerror)
解决方案2 尝试改变:
value = contact.no
作者value = contact.id
建议,如果您刚开始使用DRF,要检查代码,只需插入:
import ipdb; ipdb.set_trace()
这将使用交互式pythonshell设置一个断点,这样您就可以检查代码是否正在执行,还可以检查变量的当前内容。在在您的情况下,如果您想检查是否正在执行validate_payee,请尝试:
希望这能有所帮助。在
相关问题 更多 >
编程相关推荐