定义初始对象的Django序列化器

问题描述

我似乎无法弄清楚如何将初始值传递给序列化器。我有一个多租户django网站,我现在尝试获取API安装程序。客户字段存在,但需要隐藏并为只读。我认为这就像传统django中的形式和视图一样。我通常会在视图中传递get_initial。我先试过了,但是没有用。我想我需要直接在序列化器中获取值,但似乎无法使其正常工作。

型号:

class Location(ClientAwareModel):
    name = models.CharField(max_length=64,blank=True)
    address = models.CharField(max_length=64)
    address2 = models.CharField(max_length=64,blank=True)
    city = models.CharField(max_length=64)
    state = UsstateField()
    zip_code = USZipCodeField()

class Client(models.Model):
    name = models.CharField(max_length=100)
    subdomain_prefix = models.CharField(max_length=100,unique=True)

    def __str__(self):
        return self.name

class ClientAwareModel(models.Model):
    client = models.ForeignKey(Client,on_delete=models.PROTECT)

    class Meta:
        abstract = True

def hostname_from_request(request):
    # split on `:` to remove port
    return request.get_host().split(':')[0].lower()

def client_from_request(request):
    hostname = hostname_from_request(request)
    subdomain_prefix = hostname.split('.')[0]
    return Client.objects.filter(subdomain_prefix=subdomain_prefix).first()

序列化器(您可以看到我所有失败的尝试都已被注释掉:

class LocationSerializer(serializers.ModelSerializer):
    def get_client(self,obj):
        # return client_from_request(self.request)
        return client_from_request(self.context['request'])

    # client = serializers.SerializerMethodField('get_client')
    # client = serializers.SerializerMethodField()
    # client = serializers.Field(source='get_client',read_only=True)
    # client = serializers.ReadOnlyField(source='get_client')
    # client = serializers.PrimaryKeyRelatedField(read_only=True,default='get_client')
    client = serializers.PrimaryKeyRelatedField(read_only=True,source='get_client')
    # client = serializers.HiddenField(default=get_client(self))

    class Meta:
        model = Location
        fields = ['name','address','address2','city','state','zip_code','client']

视图集:

class LocationViewSet(viewsets.ModelViewSet):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        client = client_from_request(self.request)
        return super().get_queryset().filter(client=client)

您可以看到我尝试传递值的不同方法,但是无论我得到什么

IntegrityError at /locations/
null value in column "client_id" violates not-null constraint

解决方法

在您的视图集中,当位置模型没有客户端FK时,您尝试通过过滤客户端来获取位置。

就在这里

def get_queryset(self):
        client = client_from_request(self.request)
        return super().get_queryset().filter(client=client) <----

如上面评论中的@gregory所述,添加外键可以解决您的问题,然后只需将其添加到序列化器中即可。

,

#include <stdio.h> #include <stdlib.h> int main (int argc,char** argv) { int val; int userInput; int* arr; int size = 1; int arrIndex = 0; arr = (int*) malloc(sizeof(int) * size); /* prompt the user for input */ printf ("Enter in a list of numbers to be stored in a dynamic array.\n"); printf ("End the list with the terminal value of -999\n"); /* loop until the user enters -999 */ scanf ("%d",&val); while (val != -999) { if (arrIndex >= size) { size++; } arr[arrIndex] = val; arrIndex++; /* get next value */ scanf("%d",&val); } int j = 0; for(j = 0; j < size ; j++) { printf("%d \t",arr[j]); } } 对象传递给序列化程序的一种简单方法是以client方法传递它,例如:

perform_create

还要从序列化程序中删除客户端字段:

from rest_framework import serializers


class LocationViewSet(viewsets.ModelViewSet):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        client = client_from_request(self.request)
        return super().get_queryset().filter(client=client)

    def perform_create(self,serializer):
        client = client_from_request(self.request)
        if not client:
            raise serializers.ValidationError("Client does not exist")
        serializer.save(client=client)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...