我对Python和Django都很陌生,我遇到了一个可以为null的外键关系的问题。我发现了与此类似的问题,但它们似乎都没有覆盖我的用例。在
我使用的是django1.8.17和drf3.1.0
我在Django中有以下类(我已经将它们简化为相关字段,因为我无法轻松地在此处复制/粘贴代码):
class Rationale(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
class Alert(models.Model):
id = models.AutoField(primary_key=True)
rationale = models.ForeignKey(Rationale, null=True, blank=True)
priority = models.IntegerField(default=1)
class AlertHistory(models.Model):
id = models.AutoField(primary_key=True)
alert = = models.ForeignKey(Alert)
rationale = models.ForeignKey(Rationale, null=True, blank=True)
priority = models.IntegerField(null=True)
class AlertHistoryListView(generics.ListCreateAPIView):
queryset = AlertHistory.objects.all()
serializer_class = AlertHistorySerializer
pagination_class = DefaultPagination
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
filter_class = AlertHistoryFilterSet
filter_fields = ['alert']
ordering_fields = filter_fields
class AlertHistoryFilterSet(django_filters.FilterSet):
class Meta:
model = AlertHistory
fields = ['alert']
这里的想法是在历史记录表中捕捉对警报的更改。用户可以更新优先级或基本原理。在
基本原理表是预先填充了JSON fixture的查找表。用户可以选择一个理由来给出警报打开的原因。基本原理是可选的,因此可以为空。在
但是,当我试图将“基本原理”设置为“无”时,会出现一个错误:
{'理由':[u'不正确的类型。应为pk值,收到unicode。']}
于是我四处寻找:PrimaryKeyRelatedField:http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield
然后我更新了我的AlertHistory序列化程序:
^{pr2}$这修复了我的第一个问题,但在我更新基本原理的测试中导致了问题。通过将其标记为只读,我就无法更新该字段。在
文档中说我需要指定read-only=True或queryset。然而,它没有提供一个如何做到这一点的例子,我也无法找到它,也找不到任何地方的例子。在
我需要涵盖以下两种情况:
data={'alert':1,'priority':2,reasonal:1}为基本原理1的外键设置基本原理。在
以及:
data={'alert':1,'priority':2,reasonal:None}如果用户希望将基本原理设置为null。当他们只是更新优先级而不选择基本原理时,这个用例更有可能出现。在
所以我试着把我的查询集定义为“全部”
rationale = serializers.PrimaryKeyRelatedField(queryset=Rationale.objects.all(), allow_null=True)
但这导致了我所有的测试,其中的基本原理是没有给出最初的例外:
{'理由':[u'不正确的类型。预期的pk值,收到unicode.']},尽管我现在已将allow_null设置为True。在
然后我试着定义:
rationale = serializers.PrimaryKeyRelatedField(queryset=Rationale.objects.get(pk=rationale), allow_null=True)
但它不知道理由是什么。在
我也试过:
rationale = serializers.PrimaryKeyRelatedField(source='rationale', allow_null=True)
但这导致了我的错误:
AssertionError:Relational字段必须提供“queryset”参数,或设置read-only=True
。在
如何正确定义查询集?在
谢谢。在
使用此序列化程序:
型号:
^{pr2}$用于创建警报历史对象的json示例:
如果您想在json中将基本原理设置为空send
null
PS:确保您的数据库模式已更新,并且所有迁移都已应用。在
相关问题 更多 >
编程相关推荐