标签: django-serializer

动态添加字段到 drf 序列化器

我有一个 API 端点,它返回我的模型之一的对象列表。我有一个非常简单的序列化器,当前返回所有模型字段。

我现在需要的是向该序列化器添加另一个字段,该字段是通过在模型字段之一和另一个动态计算的数据结构上应用逻辑来计算的 - 但每次调用 API 时只应计算一次。

对于每个 API 调用但不是对于序列化器返回的每个对象,向序列化器提供此结构的方法是什么?

我的 ModelViewSet (没有额外的字段)非常简单:

class MyModelViewset(ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer
Run Code Online (Sandbox Code Playgroud)

django-models django-serializer django-rest-framework

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

如何在DRF中获取并显示父序列化器中的所有子对象

我有 3 个不同的序列化器,用于父对象和子对象的 3 个不同视图。意见是CreateAPIView,,ListAPIViewRetrieveAPIView

因此,我CreateAPIView有一个用于创建对象的序列化器,ListAPIView有一个用于列出对象的序列化器,还有RetrieveAPIView一个用于显示对象的详细信息的序列化器。对于子对象和父对象都是如此。

如何列出父对象中与其相关的所有子对象?这意味着RetrieveAPIView我想在父级中展示ListAPIView 其子级。

楷模

class Boards(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=50, blank=False, null=False, unique=True)
    slug = models.SlugField()

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Boards, self).save(*args, **kwargs)

class Lists(models.Model):

    name = models.CharField(max_length=50, blank=False, null=False, unique=True)
    slug = models.SlugField()
    board = models.ForeignKey(Boards, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Lists, …
Run Code Online (Sandbox Code Playgroud)

foreign-keys django-generic-views django-serializer django-rest-framework

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

__init__() 缺少 1 个必需的位置参数:'model_field'

我正在尝试使用嵌套序列化器,如果我从序列化器 A 中删除“product=ProductSerializer()”,代码将成功运行,否则会出现以下错误。

为什么 SizeSerializer 可以工作,但 Productserializer 却不能。

型号A

class SKU(models.Model):
    size = models.ForeignKey(Size,on_delete=models.CASCADE)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)

    number = models.CharField(max_length=100,null=True,blank=True)
    price = models.IntegerField(null=True,blank=True)
    parent_sku = models.CharField(max_length=100,null=True,blank=True)
    active = models.BooleanField(default=True)
Run Code Online (Sandbox Code Playgroud)

B型

class Product(models.Model):      
    name = models.CharField(max_length=200,null=True,blank=True)
    active = models.BooleanField(default=True)
Run Code Online (Sandbox Code Playgroud)

串行器A

class SKU_Serializer(serializers.ModelSerializer):
    size    = SizeSerializer()
    product = ProductSerializer()

    class Meta:
        model = SKU
        exclude = ('created_at','updated_at')
Run Code Online (Sandbox Code Playgroud)

串行器B

class ProductSerializer(serializers.ModelField):

    class Meta:
        model = Product
        exclude = ('created_at','updated_at')
Run Code Online (Sandbox Code Playgroud)

json

{
        "id": 1,
        "size": {
            "id": 1,
            "name": "XL",
            "active": true
        },
        "number": …
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework

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

无法更改模型序列化器中的验证字段错误消息

我正在努力ModelSerializer解决以下问题。

1)无法验证.validate(self, data)方法,因为我想返回不起作用的自定义验证器消息。

模型.py

class BlogModel(models.Model):

    BLOG_STATUS = (
        ('PUBLISH', 'Publish'),
        ('DRAFT', 'Draft'),
    )

    blog_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='blogs')
    title = models.CharField(max_length=255)
    content = models.TextField(blank=True, null=True)
    status = models.CharField(max_length=7, choices=BLOG_STATUS)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta():
        db_table = 'blogs'
        verbose_name = 'Blog'
        verbose_name_plural = 'Blogs'

    def __str__(self):
        return self.title

Run Code Online (Sandbox Code Playgroud)

序列化器.py


import datetime
from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer,Serializer
from blogs.models …
Run Code Online (Sandbox Code Playgroud)

python django django-validation django-serializer django-rest-framework

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

如何使用 Djangorestframework 中的 UpdateAPIView 更新模型中的单个字段?

我正在学习通用视图并创建一些 API。如何更新字段:mobile来自型号Contacts

我想从 URL 获取用户 ID (mobile/update/user_id),但是在创建查询集时它不起作用。我想做一些像这里提到的那样的事情:

#queryset = Contacts.objects.filter(id=Usertab.objects.filter(id=self.kwargs['id']).first().contact.id))
Run Code Online (Sandbox Code Playgroud)
class UpdateMobileAPIView(generics.UpdateAPIView):
    queryset = Contacts.objects.filter(pk=Usertab.objects.all())

    serializer_class = ContactsSerializer
    lookup_field = 'pk'

    def update(self,instance,request):
        instance = self.get_object()
        serializer= self.get_serializer(instance,data=request.data,partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response({"message":"mobile number updated successfully"})

        else:
            return Response({"message":"failed"})

Run Code Online (Sandbox Code Playgroud)

这些是模型

class Contacts(models.Model):

    mobile = models.IntegerField(null=False)
    Landline = models.IntegerField(null=False)
    whats_app = models.IntegerField(null=False)


class Usertab(models.Model):

    username = models.CharField(max_length=255,null=False,blank=False)
    address = models.CharField(max_length=255,null=False,blank=False)
    pin_code = models.CharField(max_length=255,null=False,blank=False)
    contact = models.ForeignKey(Contacts,related_name="contacts_user")


class Email(models.Model):

    user = models.ForeignKey(Usertab,related_name="user_email")
    email …
Run Code Online (Sandbox Code Playgroud)

django django-generic-views python-3.x django-serializer django-rest-framework

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

Django Rest Framework:在 modelviewset 创建中创建不需要的字段

我有一个模型,有一个用于显示其创建时间的字段,名为created_time. 我不想created_time在创建模型时被要求,但我希望它位于从模型检索的数据中!

这是它的序列化器:

class MyModelSerializer(ModelSerializer):
    class Meta:
        model = Model
        fields = ['name', 'created_time']
Run Code Online (Sandbox Code Playgroud)

这是它的视图集:

class ModelApiView(ModelViewSet):
    serializer_class = MyModelSerializer

    def get_queryset(self):
        return Model.objects.filter(user=self.request.user.id)

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

现在,根据get请求,它发送一个模型对象列表,其中namecreated_time是完美的。但是,当我发布要创建的新模型(仅包含其)时name,它会向我发送以下错误消息:

{
    "datetime": [
        "This field is required."
    ]
}
Run Code Online (Sandbox Code Playgroud)

python django datetime django-serializer django-rest-framework

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

请参阅django-rest-framework下拉列表中的说明?

如何在django-rest-framework下拉列表中查看主题名称?现在它只是说Subject object.

在此输入图像描述

这是我的模特:

class Subject(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey('auth.User', related_name='subjects')
    code = models.CharField(max_length=50)
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=50)

    class Meta:
        ordering = ('created',)

    def __unicode__(self):
        return '%s' % (self.name)

class Grade(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey('auth.User', related_name='grades')

    code = models.CharField(max_length=3)
    requirements = models.CharField(max_length=200)
    ranking = models.IntegerField()

    subject = models.ForeignKey(Subject, related_name='grades', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('subject', 'ranking')
        ordering = ('ranking',)

    def __unicode__(self):
        return '%d: %s' % (self.ranking, self.code)
Run Code Online (Sandbox Code Playgroud)

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

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

权限检查序列化器,Django休息框架,

我是相当新的django休息框架,我在权限方面有一些问题.

所以我有一个用户是组织的成员和某个组的成员.让我们说我们有一个模型:

class SomeModel:
    organization = models.ForeignKey(Organization)
    name = models.CharField()
Run Code Online (Sandbox Code Playgroud)

用户只能create/ update SomeModel为自己的组织,如果他是一组"协调员",他也可以create/ update为任何组织.

目前我的方法是在序列化器,in .create().update()方法中检查这些条件,因为数据已经过验证,我在PermissionDenied那里引发了错误.但感觉这不是"正确的方式".我尝试制作自定义权限类,但之后数据未经过验证,因为在序列化程序之前会检查权限类.你有什么建议我应该怎么做?

抱歉英语不好,这不是我的母语.谢谢!

编辑: 示例:请求数据类似于:

payload = {'organization': 1, 'name': 'Name'} 
Run Code Online (Sandbox Code Playgroud)

因此,如果用户来自组织1,或者他是协调员,则应授予访问权限并SomeModel应创建访问权限

python django django-permissions django-serializer django-rest-framework

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

在django rest框架中从序列化器发送自定义错误响应?

我想从序列化程序创建一个自定义响应创建视图到我的应用程序的前端.我尝试了休息框架响应教程,但它不起作用.我的代码是:

class UserSerializer(serializers.ModelSerializer):
"""Serializer to serialize user model object"""

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        """create a new user"""

        firstname = self.initial_data['first_name']
        lastname = self.initial_data['last_name']
        fullname = str(firstname) +" "+ str(lastname)
        email = self.initial_data['username'].lower()

        try:
           customer = User.create(
                name=fullname,
                email=email)

        except Error as e:
            error = {'message': e._message or 'Unknown error'}
            return Response(error,status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

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

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

在序列化程序中获取字段的属性(Django Rest框架)

serializers.py

from django.contrib.auth.models import User
from engine.models import Game
from rest_framework import serializers

class GameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Game
        fields = (
            'game_name',
            'level',
            'game_type',
            'creator',
            'id',
        )
Run Code Online (Sandbox Code Playgroud)

我想creator.usernamecreator刚刚返回用户对象,它是创作者的ID的整数。如何获取creator.username而不是creator?

django django-serializer django-rest-framework

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