问题描述
我似乎无法弄清楚如何将初始值传递给序列化器。我有一个多租户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)