我对Python和Django都是新手,而且我在可空的外键关系方面遇到了问题。我发现了与此类似的问题,但似乎没有一个问题涵盖了我的用例。
我使用的是Django 1.8.17和DRF 3.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的查找。用户可以选择理由来给出警报打开的原因。不过,原理是可选的,因此可以为空。
然而,当我试图将基本原理设置为None时,我得到了一个错误:
{‘基本原理’:你的类型不正确。期望的pk值,收到的unicode。‘}
所以搜索一下,我找到了: the PrimaryKeyRelatedField:http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield
然后我更新了我的AlertHistory序列化程序:
class AlertHistorySerializer(serializers.ModelSerializer):
rationale = serializers.PrimaryKeyRelatedField(read_only=True, allow_null=True)
class Meta:
model = AlertHistory这修复了我的第一个问题,但导致了测试中的问题,我正在更新原理。通过将其标记为read_only,我不能更新该字段,这并不奇怪。
文档说我需要指定read_only=True或查询集。然而,它没有提供如何做到这一点的示例,我找不到它,也找不到任何示例。
我需要涵盖以下两种情况:
data = {'alert‘:1,'priority’:2,rationale: 1 }来设置rationale 1的外键的理论基础。
和:
data = {'alert‘:1,'priority’:2,rationale: None }如果用户想要将rationale设置为null。当他们简单地更新优先级而不选择理由时,这种用例更有可能出现。
所以我试着把我的查询集定义为"all“
rationale = serializers.PrimaryKeyRelatedField(queryset=Rationale.objects.all(), allow_null=True)但这会导致我所有的测试都会给出原始的异常:
{‘基本原理’:你的类型不正确。预期的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) 但这导致了我的错误:
queryset:关系字段必须提供“”queryset“”参数,或设置read_only=True。“”
如何正确定义我的查询集?
谢谢。
发布于 2017-05-22 20:30:45
使用此序列化程序:
class AlertHistorySerializer(serializers.ModelSerializer):
class Meta:
model = AlertHistory型号:
class AlertHistory(models.Model):
id = models.AutoField(primary_key=True)
alert = = models.ForeignKey(Alert)
rationale = models.ForeignKey(Rationale, null=True)
priority = models.IntegerField(null=True)创建告警历史对象的json示例:
{
"alert": 1,
"rationale": null,
"priority": 2
}如果您想将rationale设置为null,请在json中发送null
PS:确保您的DB模式已更新,并且所有迁移都已应用。
https://stackoverflow.com/questions/44111702
复制相似问题