来自 rest_framework modelSerializer 的模型方法
Model Method from rest_framework modelSerializer
这是一个简单的问题,但我是 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
returns 为真时填充该字段吗?
我正在尝试这样的事情,
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
所以,原题依然成立:"Is it possible for the modelSerializer to access its models methods?"
另外,现在出现的另一个问题是,我可以让序列化器按需排除字段吗,即它是否可以排除 mappingid
和 projectlevelid
如果它确实是一个项目?
对于你的第一个问题 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 方法)你可以添加 'project' 字段,如果它是 True.
@argaen 完全正确,source
是 DRF 的核心论点,绝对可以解决您的问题。但是,如果字段名称与 source
相同,则使用 source
是多余的。所以上面的答案不需要您指定 source
,因为 field
name is_project
与 source
name is_project
.
相同
所以在你的情况下:
is_project = serializers.BooleanField()
这是一个简单的问题,但我是 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
returns 为真时填充该字段吗?
我正在尝试这样的事情,
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
所以,原题依然成立:"Is it possible for the modelSerializer to access its models methods?"
另外,现在出现的另一个问题是,我可以让序列化器按需排除字段吗,即它是否可以排除 mappingid
和 projectlevelid
如果它确实是一个项目?
对于你的第一个问题 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 方法)你可以添加 'project' 字段,如果它是 True.
@argaen 完全正确,source
是 DRF 的核心论点,绝对可以解决您的问题。但是,如果字段名称与 source
相同,则使用 source
是多余的。所以上面的答案不需要您指定 source
,因为 field
name is_project
与 source
name is_project
.
所以在你的情况下:
is_project = serializers.BooleanField()