标签: django-serializer

Django 根据参数使用不同的序列化器

我有一个 APIView 提供我的模型实例。我想根据 url 参数使用不同的序列化器,因为我想根据参数提供不同的字段。我不想对所有情况都使用 if else 检查,因此我使用了一个函数,该函数根据类型键从序列化器对象 dict 提供序列化器。有好的解决办法吗?有人有更好的建议吗?另外,您在考虑使用不同的端点而不是这种方法。这是代码:

urls.py

from django.urls import path
from .views import MySerializerTestView

urlpatterns = [
    path('<slug:type>', MySerializerTestView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

模型.py

from django.db import models
class MyModel(models.Model):
    field_first = models.CharField(max_length=10)
    field_second = models.CharField(max_length=10)
    field_third = models.CharField(max_length=10)
Run Code Online (Sandbox Code Playgroud)

视图.py

from .models import MyModel
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import MyFirstSerializer,MySecondSerializer,MyThirdSerializer

class MySerializerTestView(APIView):
    def get(self, request, **kwargs):
        my_data = MyModel.objects.all()
        serializer = self.get_serializer(self.kwargs['type'],my_data)
        return Response(serializer.data)


    def get_serializer(self,type,data):
        my_serializers = {
        'first':MyFirstSerializer(data,many=True),
        'second':MySecondSerializer(data,many=True),
        'third':MyThirdSerializer(data,many=True), …
Run Code Online (Sandbox Code Playgroud)

python django django-serializer django-rest-framework

1
推荐指数
1
解决办法
2116
查看次数

Django Rest 框架 - 序列化器始终返回空对象 ({})

我正在使用 django rest 框架在 django 中创建第一个rest api

我无法获取 json 格式的对象。序列化器始终返回空对象 {}

模型.py

class Shop(models.Model):
    shop_id = models.PositiveIntegerField(unique=True)
    name = models.CharField(max_length=1000)
    address = models.CharField(max_length=4000)
Run Code Online (Sandbox Code Playgroud)

序列化器.py

class ShopSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shop
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

视图.py

@api_view(['GET'])
def auth(request):
    username = request.data['username']
    password = request.data['password']
    statusCode = status.HTTP_200_OK
    try:
        user = authenticate(username=username, password=password)
        if user:
            if user.is_active:
                
                context_data = request.data
                
                shop = model_to_dict(Shop.objects.get(retailer_id = username))
                shop_serializer = ShopSerializer(data=shop)
                if shop:
                    try:
                        
                        if shop_serializer.is_valid():
                            print('is valid')
                            print(shop_serializer.data)
                            context_data = shop_serializer.data
                        else:
                            print('is …
Run Code Online (Sandbox Code Playgroud)

django django-models django-views django-serializer django-rest-framework

1
推荐指数
1
解决办法
1976
查看次数

如何在django Rest框架中序列化外键字段

我在一个使用 DRF 的项目中工作,我得到的序列化器数据如下,这绝对没问题:

{
    "message": "Updated Successfully",
    "status": 200,
    "errors": {},
    "data": {
        "id": 8,
        "user": 2,
        "item": 1,
        "quantity": 4,
        "created_at": "2021-08-11T13:49:27.391939Z",
        "updated_at": "2021-08-11T13:51:07.229794Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

但我想得到如下:

{
    "message": "Updated Successfully",
    "status": 200,
    "errors": {},
    "data": {
        "id": 8,
        "user": "user name",
        "item": "product name",
        "price: "3.44",
        "quantity": 4,
        "created_at": "2021-08-11T13:49:27.391939Z",
        "updated_at": "2021-08-11T13:51:07.229794Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 DRF RelatedFieldPrimaryKryRelatedField但在所有这些情况下,我需要创建read_only=True我想跳过的相应字段。

我也尝试过depth = 1它给出了完整的细节

我的型号:

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    item = …
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework django-rest-viewsets drf-queryset

1
推荐指数
1
解决办法
9705
查看次数

如何在 django Rest 框架中将查询参数传递给 SerializerMethodField?

我想根据 GET 调用中获得的查询参数过滤掉一些实例。

class RevisionSerializer(serializers.ModelSerializer):
    slot_info = serializers.SerializerMethodField(required=False, read_only=True)
    batch_config = serializers.SerializerMethodField(required=False, read_only=True)

    class Meta:
        model = Revision
        fields = ['id', 'status', 'revision_id', 'instructor', 'number_of_classes', 'start_date',
                  'slot', 'slot_info', 'tinyurl', 'zoom_link', 'batch_config']
        read_only_fields = ['revision_id']

    def get_batch_config(self, obj):
        # filter this on the incoming data from the GET call
        related_batches = CompensationClass.objects.select_related('style', 'instructor').filter(
            compensation_class_id=obj.revision_id)

        batch_config_values = related_batches.values('batch_id', 'age_group', 'level', 'course_version', 'style__name',
                                                     'class_number')
        return batch_config_values
Run Code Online (Sandbox Code Playgroud)

这是我的序列化器,我将传递一个日期,并根据该日期我想过滤我的序列化器方法字段。我怎样才能实现这个目标?

django django-serializer django-rest-framework

1
推荐指数
1
解决办法
2498
查看次数

如何在序列化程序中获取字段值

我想获取传递给函数中的序列化程序的id
id = serializers.IntegerField(label='ID')以获取配置文件对象

def profile_info(self, obj)

但它给出的错误idIntegerField请传递 int 或 string

任何人都可以告诉我如何获取在id字段中传递的值,谢谢。下面是我的序列化程序代码

class UserSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(label='ID')
    # print ('dadddaaa ',serializers.data)
    profile = serializers.SerializerMethodField('profile_info')
    username = serializers.CharField()
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    # Nazir = serializers.CharField()
    # profile = UsersSerializer(Profile.objects.get(User.objects.get(pk=serializers.data['id'])))
    def profile_info(self, obj): 
        # print ('selffff   ', serializers)
        prof_obj = Profile.objects.get(user=User.objects.get(pk=id))
        return {'id':prof_obj.id}
Run Code Online (Sandbox Code Playgroud)

django serialization django-models django-serializer

0
推荐指数
1
解决办法
1万
查看次数

如何在序列化程序中提及密码字段?

我有一个用于身份验证的自定义用户,并想为其创建一个序列化程序类,我的自定义用户模型如下所示:

class User (AbstractUser):
        bio = models.TextField(max_length=500, blank=True)
        birth_date = models.DateField(null=True, blank=True)
        image=models.FileField(null=True , blank=True)
Run Code Online (Sandbox Code Playgroud)

而我的序列化器是:

class UserSerializer (serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username' ,'email' ,'password' ,'firstname' , 'last name' )
Run Code Online (Sandbox Code Playgroud)

我怎么能提到密码字段是密码,并且其内容必须被散列?

python django django-serializer django-rest-framework

0
推荐指数
2
解决办法
3177
查看次数

如何在perform_create视图集中添加用户(djangorest框架)?

我想做一个“评论”表。在表中,将有一个包含创建评论的 user_id 的字段。与评论表相关的用户来自Django默认用户模型。这是评论模型:

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

这是评论序列化器:

class CommentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Comment
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

这是创建新评论的视图集:

class CommentViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    permission_classes = (IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

我还将用户与 django rest jwt 集成以进行授权。这是我发送到 API 的标头和数据。

标题:

授权:持有者{jwt token}

内容类型:application/json

身体:

{ "content": "这是评论" }


但我得到这样的回应:

{ "user": [ "此字段为必填项。" ] }


如何修复序列化器,以便它从令牌(request.user)中检索用户?

django-serializer django-rest-framework django-rest-viewsets django-rest-framework-jwt

0
推荐指数
1
解决办法
2744
查看次数

Django Rest Framework 序列化程序正在打印元组而不是 json

我有以下序列化程序:

from rest_framework import serializers

from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    """ Serializer for Product object """

    class Meta:
        model = Product
        fields = ['name', 'slug', 'description', 'image', 'price', 'active',]
Run Code Online (Sandbox Code Playgroud)

以及以下测试:

from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APIClient
from rest_framework import status

from .factories import ProductFactory
from .models import Product
from .serializer import ProductSerializer

PRODUCTS_URL = reverse('product-list')

def create_product(**params):
    """ Helper function to create a new product """
    return Product.objects.create(**params)

class PublicProductApiTests(TestCase):
    """
    Test the …
Run Code Online (Sandbox Code Playgroud)

django serialization python-3.x django-serializer django-rest-framework

0
推荐指数
1
解决办法
361
查看次数

使用 ID 进行 POST 并获取嵌套对象在 ModelSerializer 中不能同时在 django 中工作

我已经花了几天时间在类似问题中研究这个问题,但无法找到解决方案。这应该很简单,我有一个模型:

model.py

class Item(models.Model):
    """Class to represent an item..."""

    label = models.TextField(null=True)
    name = models.TextField()

    category = models.ForeignKey(   "Category", on_delete=models.SET_NULL,
                                    null=True, default=DEFAULT_CATEGORY_ID)

class Category(models.Model):
    """Class to represent the category of an Item. Like plants, bikes..."""
    name = models.TextField()

    description = models.TextField(null=True)
Run Code Online (Sandbox Code Playgroud)

view.py

class ItemViewset(viewsets.ModelViewSet): # pylint: disable=too-many-ancestors
    """API Endpoint to return the list of items"""
    queryset = Item.objects.all()
    serializer_class = ItemSerializer
Run Code Online (Sandbox Code Playgroud)

serializer.py

class ItemSerializer(serializers.ModelSerializer):
    """Serializer for Item."""

    category = CategorySerializer(read_only=True)

    class Meta: # pylint: disable=too-few-public-methods
        """Class to represent metadata of …
Run Code Online (Sandbox Code Playgroud)

python django post django-serializer django-rest-framework

0
推荐指数
1
解决办法
1050
查看次数