在Django的非托管mod中模拟Oracle主键

2024-10-01 17:22:32 发布

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

我正在处理一个遗留项目(Django 1.7、DRF 2.0和Oracle 11.2),我希望REST API检索并填充一个预先存在的Oracle表,我将其定义为以下模型:

class ParametriZgodovina(models.Model):

    amp_sif = models.CharField(max_length=5, blank=True)
    kolicina = models.CharField(max_length=20, blank=True)
    datum_od = models.DateField(blank=True, null=True)
    id_np = models.FloatField(blank=True, null=True)
    opomba = models.CharField(max_length=1000, blank=True)
    opomba_user_id = models.FloatField(blank=True, null=True)
    opomba_datetime = models.DateField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'parametri_zgodovina'

当我得到DatabaseError: ORA-00904: "PARAMETRI_ZGODOVINA"."ID" invalid identifier时,我在模型定义中插入了另一个字段:

rowid = models.CharField(max_length=20, primary_key=True)

这允许我检索甚至修改数据,但是通过.restore_object()插入新实例失败,结果是DatabaseError: ORA-01733: virtual column not allowed here。你知道吗

此外,当试图使用print(instance.values())在View的get()方法中显式打印模型实例时,我得到了DatabaseError: ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.

我的观点是这样的:

class ParametriZgodovinaView(APIView):

    def get(self, request):
        events = ParametriZgodovina.objects.all().order_by('amp_sif', 'kolicina','datum_od')

        serializer = ParametriZgodovinaSerializer(events, many=True)

        if serializer.is_valid():
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


    def post(self, request):

        serializer = ParametriZgodovinaSerializer(data=request.DATA, context={'request': request})

        if serializer.is_valid():

            serializer.save()

            return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的序列化程序是:

class ParametriZgodovinaSerializer(serializers.ModelSerializer):

    class Meta:
        model = ParametriZgodovina
        fields = ('amp_sif', 'kolicina', 'id_np', 'opomba', "opomba_datetime")

    def restore_object(self, attrs, instance=None):

        instance = ParametriZgodovina(
            amp_sif = attrs["amp_sif"],
            kolicina = attrs["kolicina"],
            id_np = attrs["id_np"],
            opomba = attrs["opomba"],
            opomba_user_id = self.context['request'].user.id,
            opomba_datetime = datetime.utcnow() + timedelta(hours=1),
            datum_od = datetime.utcnow() + timedelta(hours=1)
        )

        instance.save()

        return instance

问题:如何在Django模型中正确地模仿Oracle的primery键,以便在非托管Oracle表上充分利用Django的ORM?

我找到的最接近的解决方案是this线程,然而扩展CharField类对我来说似乎是一个黑客解决方案。。。你知道吗


Tags: instanceidtruedatetimemodelsrequeststatusclass

热门问题