当allow_null=Tru时Django PrimaryKeyRelatedField queryset

2024-09-30 20:38:03 发布

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

我对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。在

如何正确定义查询集?在

谢谢。在


Tags: truefieldsmodelsalertfilternullclass基本原理
1条回答
网友
1楼 · 发布于 2024-09-30 20:38:03

使用此序列化程序:

class AlertHistorySerializer(serializers.ModelSerializer):

    class Meta:
        model = AlertHistory

型号:

^{pr2}$

用于创建警报历史对象的json示例:

{
    "alert": 1,
    "rationale": null,
    "priority": 2
}

如果您想在json中将基本原理设置为空send null

PS:确保您的数据库模式已更新,并且所有迁移都已应用。在

相关问题 更多 >