请帮我解决问题。我正在构建一个由 Django Rest Framework 和 ReactJS 组成的应用程序。我使用了视图集。
我的错误:
响应数据:
{"detail":"CSRF Failed: Origin checking failed - http://localhost:8000/ does not match any trusted origins."}
Run Code Online (Sandbox Code Playgroud)
ReactApp中的DeleteLead函数
export const deleteLead = (id) => (dispatch) => {
axios
.delete(`/api/leads/${id}/`)
.then((res) =>
dispatch({
type: DELETE_LEAD,
payload: id,
})
)
.catch((err) => {
console.log(err);
});
};
Run Code Online (Sandbox Code Playgroud)
LeadViewSet:从rest_framework导入视图集,权限从.serializsers导入LeadSerializers从leads.models导入Lead
# lead viewset
class LeadViewSet(viewsets.ModelViewSet):
queryset = Lead.objects.all()
# permission - bu ruxsat beruvchi
permission_classes = [
permissions.AllowAny # barcha uchun ruxsat
]
serializer_class = LeadSerializers
Run Code Online (Sandbox Code Playgroud)
LeadSerzializers:
# lead serializer …
Run Code Online (Sandbox Code Playgroud) 在这里:http : //www.django-rest-framework.org/api-guide/viewsets/#modelviewset它说“ModelViewSet 类提供的操作是 .list()、.retrieve()、.create() 、.update()、.partial_update() 和 .destroy()。”
在这里:http : //www.django-rest-framework.org/api-guide/serializers/#modelserializer它说“ModelSerializer 类与常规 Serializer 类相同,除了:它包括 . create() 和 .update()。”
1)假设有一个 ViewsetUserViewSet
和 routeruser
和 serializer UserSerializer
。如果我发送了一个POST
to/user/
它叫UserViewSet
'screate()
还是UserSerializer
's create()
?
2)假设UserViewSet
有这个权限:
class NoCreate(permissions.BasePermission):
"""
No one can create this object.
"""
message = 'You do not have permission to complete the action you are trying to perform.'
def has_permission(self, request, view):
if view.action == …
Run Code Online (Sandbox Code Playgroud) django serialization django-rest-framework django-rest-viewsets
我有一个 Django 休息框架GenericViewset,我试图为它设置分页,如下所示:
#settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20
}
#views.py
class PolicyViewSet(viewsets.GenericViewSet):
def list(self, request):
queryset = Policy.objects.all()
page = self.paginate_queryset(queryset)
serializer = PolicySerializer(page, many=True)
return self.get_paginated_response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
这按预期工作。 但是,如果我尝试使用普通的Viewset执行相同的操作,如下所示:
#views.py
class PolicyViewSet(viewsets.ViewSet):
def list(self, request):
queryset = Policy.objects.all()
page = self.paginate_queryset(queryset)
serializer = PolicySerializer(page, many=True)
return self.get_paginated_response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:
'PolicyViewSet' 对象没有属性 'paginate_queryset'
如何使用普通的Viewset设置分页。DRF 中的 GenericViewset 和 Viewset 有什么区别?
我试图过滤搜索剩余的api页面,并想使用方法字段作为搜索字段之一,但是,当我这样做时,我收到一条错误消息,指出该字段无效,然后它在模型中列出了唯一的字段有效来源
序列化器:
class SubnetDetailsSerializer(QueryFieldsMixin, serializers.HyperlinkedModelSerializer):
subnet = serializers.SerializerMethodField()
device = serializers.ReadOnlyField(
source='device.hostname',
)
circuit_name = serializers.ReadOnlyField(
source='circuit.name',
)
subnet_name = serializers.ReadOnlyField(
source='subnet.description',
)
safe_subnet = serializers.SerializerMethodField()
def get_safe_subnet(self, obj):
return '{}{}'.format(obj.subnet.subnet, obj.subnet.mask.replace('/','_'))
def get_subnet(self, obj):
return '{}{}'.format(obj.subnet.subnet, obj.subnet.mask)
class Meta:
model = DeviceCircuitSubnets
fields = ('id','device_id','subnet_id','circuit_id','subnet','safe_subnet','subnet_name','device','circuit_name')
Run Code Online (Sandbox Code Playgroud)
意见:
class SubnetDetailsSet(viewsets.ReadOnlyModelViewSet):
queryset = DeviceCircuitSubnets.objects.all().select_related('circuit','subnet','device')
serializer_class = SubnetDetailsSerializer
permission_classes = (IsAdminUser,)
filter_class = DeviceCircuitSubnets
filter_backends = (filters.SearchFilter,)
search_fields = (
'device__hostname',
'circuit__name',
'subnet__subnet',
'safe_subnet'
)
Run Code Online (Sandbox Code Playgroud)
如何在搜索字段中包含safe_subnet?
谢谢
编辑 这是现在的代码
views.py
class SubnetDetailsSet(viewsets.ReadOnlyModelViewSet):
queryset …
Run Code Online (Sandbox Code Playgroud) PUT
并且PATCH
都是同一个 mixin (The UpdateModelMixin ) 的一部分。
所以如果我像这样扩展它:
class UserViewSet(mixins.UpdateModelMixin, GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)
这两个PUT
和PATCH
是允许的。我想完全不允许PUT
我的应用程序(因为PATCH
已经完成了工作,并且我想仅使用 限制对象创建POST
)。一种方法是创建权限:
class NoPut(permissions.BasePermission):
"""
PUT not allowed.
"""
message = 'You do not have permission to complete the action you are trying to perform.'
def has_object_permission(self, request, view, obj):
if view.action == "update":
return False
return True
Run Code Online (Sandbox Code Playgroud)
并将此权限授予我所有允许PATCH
. 这是最好的方法吗?有没有更优选的方式?
编辑:查看@wim 提供的答案后,这会是一个很好的解决方案吗(除了映射put
被删除外,所有内容都保持不变):
from rest_framework.routers import SimpleRouter
class …
Run Code Online (Sandbox Code Playgroud) 我已经定义了一个这样的模型:
class Doctor(models.Model):
name = models.CharField(max_length=100)
is_active = models.BooleanField(default=True)
Run Code Online (Sandbox Code Playgroud)
我的序列化器:
class DoctorSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = ('id', 'name', )
Run Code Online (Sandbox Code Playgroud)
在视图中:
class DoctorViewSet(viewsets.ModelViewSet):
queryset = Doctor.objects.all()
serializer_class = DoctorSerializer
Run Code Online (Sandbox Code Playgroud)
现在,我可以通过使用 http 方法DELETE调用 url: 'servername/doctors/id/'来删除医生。但是,我想覆盖此模型的删除行为。我希望,当用户删除一条记录时,它的is_active字段设置为false,而不实际从数据库中删除记录。我还想保留 Viewset 的其他行为,如列表、放置、创建等。
我怎么做?我在哪里编写覆盖此删除行为的代码?
python django django-rest-framework sql-delete django-rest-viewsets
我正在使用 django rest 框架,并且我有一个通过模型视图集和模型序列化器创建的对象。此视图只能由经过身份验证的用户访问,并且对象应将其“uploaded_by”字段设置为该用户。
我已经阅读了文档,并得出结论,这应该可行
视图集:
class FooViewset(viewsets.ModelViewSet):
permission_classes = [permissions.IsAdminUser]
queryset = Foo.objects.all()
serializer_class = FooSerializer
def get_serializer_context(self):
return {"request": self.request}
Run Code Online (Sandbox Code Playgroud)
序列化器:
class FooSerializer(serializers.ModelSerializer):
uploaded_by = serializers.PrimaryKeyRelatedField(
read_only=True, default=serializers.CurrentUserDefault()
)
class Meta:
model = Foo
fields = "__all__"
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: bar_foo.uploaded_by_id
Run Code Online (Sandbox Code Playgroud)
这表明序列化程序没有填充“uploaded_by”。
根据我对文档的理解,这应该已将该字段添加到来自序列化程序的验证数据中,作为 create 方法的一部分。
显然我误解了一些东西!
django django-serializer django-rest-framework django-rest-viewsets
我有如下的观点:
from rest_framework import viewsets
from paas.serializers import UserSerializer
import logging
logger= logging.getLogger(__name__)
class UserViewSet(viewsets.ViewSet):
def list(self,request):
pass
def create(self,request):
logger.info(request.data)
current_user = UserSerializer.create()
Run Code Online (Sandbox Code Playgroud)
另外,我在代码中使用了基于DRF令牌的身份验证。我怎样简单地说这种create
方法不需要身份验证?如您所知,在使用令牌实现身份验证之后,所有请求都应该Token
在标头中,而任何没有请求的请求都将收到403错误。
我在解析视图集中的request.data时遇到问题。我有一个模型,可以根据产品添加多个图像。
我想从传入数据中分离图像,将产品数据发送到 ProductSerializer,然后将图像与产品数据一起发送到其序列化器并保存。
我有两个模型,就像这样:
def Product(models.Model):
name = models.CharField(max_length=20)
color = models.ForeignKey(Color, on_delete=models.CASCADE)
def Color(models.Model):
name = models.CharField(max_length=15)
def ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
image = models.ImageField(upload_to='product_pics/')
Run Code Online (Sandbox Code Playgroud)
我想发送到产品(127.0.0.1:8000/products/)的请求就像:
{
"name": "strawberry",
"color": {
"name": "red"
},
"productimage_set": [
{"image": "<some_encode_image_data>"}
]
}
Run Code Online (Sandbox Code Playgroud)
序列化器没有什么特别的,只是提取标签链接,所以我没有写它。如何发送多部分/表单数据以及如何在视图集中解析它?或者解决办法是什么?
python django serialization django-rest-framework django-rest-viewsets
我正在尝试使用来自以这种格式发送 POST 请求的回调 API 的数据:
[
{
"key1": "asd",
"key2": "123"
}
]
Run Code Online (Sandbox Code Playgroud)
然而,我的 API 目前仅在像这样发送时才有效:
{
"key1": "asd",
"key2": "123"
}
Run Code Online (Sandbox Code Playgroud)
序列化器.py:
class RawIncomingDataSerializer(serializers.ModelSerializer):
class Meta:
model = RawIncomingData
fields = '__all__'
Run Code Online (Sandbox Code Playgroud)
视图.py:
class RawIncomingDataViewSet(viewsets.ModelViewSet):
queryset = RawIncomingData.objects.all()
serializer_class = RawIncomingDataSerializer
Run Code Online (Sandbox Code Playgroud)
发布数据中只会有一个对象,因此我正在寻找一种简单的解决方法,而无需重写序列化器来解释一个发布请求中的多个对象。