gpt4 book ai didi

django - 来自 rest_framework modelSerializer 的模型方法

转载 作者:行者123 更新时间:2023-12-04 14:57:48 26 4
gpt4 key购买 nike

这是一个简单的问题,但我对 django-rest-framework 很陌生。

我想知道是否有任何方法可以从序列化程序访问模型上定义的方法。?

说我有一个模型

class Listing(models.Model):
listingid = models.BigIntegerField(primary_key=True)
mappingid = models.BigIntegerField()
projectlevelid = models.IntegerField()
subsellerid = models.IntegerField()
iscreatedbyadmin = models.BooleanField(default=None, null=True)
createdon = models.DateTimeField(auto_now_add=True, editable=False)
validationstatus = models.SmallIntegerField(default=0)

def is_project(self):
""" Returns True if listing is of Project Type (projectlevelid=6) else False"""
if self.projectlevelid == 6:
return True
else:
return False

def get_project_info(self):
"""Returns False if listing is not mapped to a project, else returns the project info"""
if self.is_project() == False:
return False
return models.Project.objects.get(projectid=self.mappingid)

序列化程序是否可以使用
class ListingSerializer(serializers.ModelSerializer):

class Meta:
model = models.MasterListing

有权访问 Listing.is_project即对于 Listing 的对象模型,序列化程序可以调用它的 is_project方法?

如果是这样,我可以在序列化程序中设置一个字段,如果 is_project返回 true,该字段已填充?
我正在尝试这样的事情,
class ListingSerializer(serializers.ModelSerializer):
project = serializers.SomeRELATEDFieldTYPE() # this field if populated if the `is_project` is true

class Meta:
model = models.MasterListing

我知道我可以使用 required=False 的某种组合来做到这一点。和 SerializerMethodField ,但也许有更简单的方法?

注意:我无法为 mappingid 设置外键,因为它取决于 projectlevelid .我也无法影响这种关系,因此不可能进一步正常化。我知道可能有一些使用内容类型的方法,但是如果可能的话,我们会尽量避免这种情况。

编辑 : 我解决了问题,但没有按照指定的问题解决。
我用过这个:
class ListingSerializer(serializers.ModelSerializer):
project = serializers.SerializerMethodField()

def get_project(self, obj):
"""Returns False if listing is not mapped to a project, else returns the project info"""
if str(obj.projectlevelid) == str(6):
projectObj = models.Project(projectid=obj.mappingid)
projectObjSerialized = ProjectSerializer(projectObj)
return projectObjSerialized.data
return False

class Meta:
model = models.MasterListing

因此,最初的问题仍然存在:“modelSerializer 是否可以访问其模型方法?”

另外,现在出现的另一个问题是, 我可以让序列化程序按需排除字段吗,即它可以排除 mappingidprojectlevelid如果它确实是一个项目?

最佳答案

对于您的第一个问题 source属性是答案,引用:

May be a method that only takes a self argument, such as URLField('get_absolute_url')



对于您的第二个答案,是的,这也是可能的。检查它在他们的文档中提供的示例: http://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields

PS:我真的很喜欢 drf,因为它的文档非常完整 =)。

编辑

要使用 source 属性,您可以像这样声明一个新的显式字段:
is_project = serializers.BooleanField(source='is_project')

有了这个, is_project 字段具有实例的 is_project 方法的值。有了这个,在创建动态序列化程序(通过修改其 init 方法)时,如果它为 True,您可以添加“项目”字段。

关于django - 来自 rest_framework modelSerializer 的模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28104988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com