编辑Serializer中的外键字段 - Django Rest Framework

时间:2016-01-06 11:39:52

标签: python django django-rest-framework

我正在使用Django Rest Framework。我正在使用此建议在自动建议Select2 dropdown but allow new values by user?中添加新值。但对我来说似乎几乎不可能。

收款人是外键字段。如果字符串连同'(新)'返回而不是主键,我需要在Contacts模型中创建对象,并应将新创建的对象的主键设置为收款人字段。

models.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) 

serializers.py

class TransactionSerializer(serializers.ModelSerializer):
    reminder = ReminderSerializer()

    class Meta:
      model = Transactions
      fields=('pk','payee','reminder'...)

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

    def create(self, validated_data):
       ...  #writable nested serializer for reminder field.

    def update(self, instance, validated_data):
       ...  #writable nested serializer for reminder field.

甚至没有调用validate_payee。我甚至尝试在create()中添加相同的逻辑,但是在某些地方django的默认验证器出现在所有这些之前并抛出错误消息说

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

我是Django的初学者。我已经搜索了几乎所有的stackoverflow问题。没有什么对我有用,或者我在某处犯了错误。

1 个答案:

答案 0 :(得分:0)

解决方案#1

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

发生上述错误是因为TransactionSerializer正在处理字段“payee” ForeignKeyField(就像PK)。

因此,当调用validate_payee方法而不是返回PK值时, 你正在返回一个unicode字符串。

我认为您正在尝试将valdiate_payee中的收款人作为实例处理 收款人模型。

如果这是您想要的,那么我的建议是更新TransactionSerializer并尝试添加以下行之一:

reminder = ReminderSerializer()
payee = PayeeSerializer() # This is one
payee = ContactSerializer() # Or this one.

执行以上操作确保validate_payee函数返回实例 接触。

如果验证不正确,只需提出ValidationError(http://www.django-rest-framework.org/api-guide/exceptions/#validationerror

解决方案#2 尝试改变: value = contact.no的{​​{1}}

如果您刚刚开始使用DRF,请转发,检查您的代码,只需插入:value = contact.id这将设置交互式python shell的断点,以便您可以检查该代码是否正在执行以及您可以检查变量的当前内容。

如果您想检查validate_payee是否正在执行,请尝试:

import ipdb; ipdb.set_trace()

希望这可以提供帮助。