django-rest-framework

时间:2017-11-03 13:39:22

标签: django django-rest-framework

我有两个模型(代码已简化):

class Document(models.Model):
    data = JSONField()


class Item(models.Model):
    name = models.CharField(max_length=10)
    doc = models.OneToOneField(
              Document,
              blank=True, null=True,
              on_delete=models.SET_NULL
    )

我想使用HyperlinkedIdentityField为Item中的序列化程序创建一个指向Documents详细信息页面的超链接。 所以我定义了URL:

url(r'^doc/(?P<version>[v1|v2]+)/(?P<pk>[0-9]+)/$',
    doc_details,
    name = 'api_document_details'
),

我制作了以下序列化器:

class ItemSerializer(serializers.ModelSerializer):
    doc = serializers.HyperlinkedIdentityField(
                view_name  = 'api_document_details',
                lookup_field = 'doc_id',
                lookup_url_kwarg = 'pk'
    )
    class Meta:
        model = Item
        fields = ('name', 'doc')

这里的问题是Item中的doc字段是可选的。我得到了error,因为如果doc_id = None,则找不到URL。

  

无法使用视图名称解析超链接关系的URL&#34; api_document_details&#34;。您可能未能在API中包含相关模型,或者在此字段上错误地配置了lookup_field属性。

如果文档未在记录中定义,我希望HyperlinkedIdentityField返回None(null)。有人知道怎么做吗?

我尝试使用SerializerMethodField()方法,我使用reverse函数,如果出现异常则返回None,但这有两个缺点:

  1. 我看不到要求的版本,因此我默认为v1
  2. 生成的是相对url,域名是否包含在返回值中。

0 个答案:

没有答案