编辑序列化程序Django Rest Fram中的外键字段

2024-06-28 19:40:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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问题。没有什么对我有用,或者我在某个地方犯了个错误。在


Tags: djangonamepy模型truemodelmodelsnull
1条回答
网友
1楼 · 发布于 2024-06-28 19:40:02

解决方案1

{payee: ["Incorrect type. Expected pk value, received unicode."]}

发生上述错误是因为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,请尝试:

def validate_payee(self, value):
      import ipdb; ipdb.set_trace()
      if "  (NEW)" not in value:
        return value
      else:
        payee = value.replace("  (NEW)", "")
        contact = Contacts.objects.create(name = payee)
        value = contact.no
        return value

希望这能有所帮助。在

相关问题 更多 >