Django rest froamwork-序列化关系

关系字段用于表示模型关系。它们可以应用于 ForeignKeyManyToManyFieldOneToOneField 关系,也可以应用于反向关系和自定义关系(如GenericForeignKey)。

注意:关系字段是在relations.py中声明的,但按照惯例,您应该使用 from rest_framework import serializersserializers 模块导入它们,并将字段引用为 serializers.<FieldName>

注意:REST框架不会尝试根据 select_relatedprefetc_related 自动优化传递给序列化程序的查询集,因为这太神奇了。具有通过其源属性跨越orm关系的字段的序列化程序可能需要额外的数据库命中才能从数据库中获取相关对象。程序员有责任优化查询,以避免在使用此类序列化程序时可能发生的额外数据库命中。

例如,如果未预取tracks字段,则以下序列化程序每次评估tracks字段时都会导致数据库命中:

class AlbumSerializer(serializers.ModelSerializer):tracks = serializers.SlugRelatedField(many=True,read_only=True,slug_field='title')class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']# For each album object, tracks should be fetched from database
qs = Album.objects.all()
print(AlbumSerializer(qs, many=True).data)

如果使用 AlbumSerializer 序列化一个相当大的查询集,其中 many=True,那么这可能是一个严重的性能问题。

使用优化传递给 AlbumSerializer 的查询集:

qs = Album.objects.prefetch_related('tracks')
# No additional database hits required
print(AlbumSerializer(qs, many=True).data)

会解决此问题。

检查关系

使用ModelSerializer类时,将自动为您生成序列化程序字段和关系。检查这些自动生成的字段是确定如何自定义关系样式的有用工具。

要做到这一点,请使用 python manage.py shell 打开Django shell,然后导入序列化程序类,实例化它,并打印对象表示…

>>> from myapp.serializers import AccountSerializer
>>> serializer = AccountSerializer()
>>> print(repr(serializer))
AccountSerializer():id = IntegerField(label='ID', read_only=True)name = CharField(allow_blank=True, max_length=100, required=False)owner = PrimaryKeyRelatedField(queryset=User.objects.all())

1 api 参考

为了解释各种类型的关系字段,我们将使用几个简单的模型作为示例。我们的模型将用于音乐专辑,以及每张专辑中列出的曲目。

class Album(models.Model):"""专辑"""album_name = models.CharField(max_length=100)artist = models.CharField(max_length=100)class Track(models.Model):"""歌曲"""album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)order = models.IntegerField()title = models.CharField(max_length=100)duration = models.IntegerField()class Meta:unique_together = ['album', 'order']ordering = ['order']def __str__(self):return '%d: %s' % (self.order, self.title)

1.1 StringRelatedField

StringRelatedField 可用于使用其__str__方法表示关系的目标。
例如,以下序列化程序:

class AlbumSerializer(serializers.ModelSerializer):tracks = serializers.StringRelatedField(many=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将序列化为以下表示形式:

{'album_name': 'Things We Lost In The Fire','artist': 'Low','tracks': ['1: Sunflower','2: Whitetail','3: Dinosaur Act',...]
}

此字段为只读字段。

参数:

  • many - 如果应用于多对多关系,则应将此参数设置为 True

1.2 PrimaryKeyRelatedField

PrimaryKeyRelatedField可用于使用其主键来表示关系的目标。

例如,以下序列化程序:

class AlbumSerializer(serializers.ModelSerializer):tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将序列化为以下表示形式:


{'album_name': 'Undun','artist': 'The Roots','tracks': [89,90,91,...]
}

默认情况下,此字段是读写的,尽管您可以使用read_only标志更改此行为。

参数:

  • queryset - 验证字段输入时用于模型实例查找的queryset。关系必须显式设置查询集,或者设置 read_only=True
  • many - 如果应用于多对多关系,则应将此参数设置为True
  • allow_null - 如果设置为True,则字段将接受None值或可为null关系的空字符串。默认为False
  • pk_field — 设置为用于控制主键值的序列化/反序列化的字段。例如,pk_field=UUIDField(format='hex')会将UUID主键序列化为其紧凑的十六进制表示。

1.3 HyperlinkedRelatedField

HyperlinkedRelatedField可用于使用超链接来表示关系的目标。

例如,以下序列化程序:

class AlbumSerializer(serializers.ModelSerializer):tracks = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name='track-detail')class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将序列化为以下表示形式:

{'album_name': 'Graceland','artist': 'Paul Simon','tracks': ['http://www.example.com/api/tracks/45/','http://www.example.com/api/tracks/46/','http://www.example.com/api/tracks/47/',...]
}

默认情况下,此字段是读写的,尽管您可以使用read_only标志更改此行为。


注意:此字段是为映射到接受单个URL关键字参数的URL的对象设计的,如使用lookup_fieldlookup_url_kwarg参数设置的。
这适用于包含单个主键或段塞参数作为URL一部分的URL。
如果需要更复杂的超链接表示,则需要自定义字段,如下面的自定义超链接字段部分所述。


参数:
view_name - 应用作关系目标的视图名称。如果您使用的是标准路由器类,这将是一个格式为<modelname>-detail 的字符串。必需。
queryset - 验证字段输入时用于模型实例查找的queryset。关系必须显式设置查询集,或者设置 read_only=True
many - 如果应用于多对多关系,则应将此参数设置为True。
allow_null -如果设置为True,则字段将接受None值或可为null关系的空字符串。默认为False。
lookup_field - 目标上应用于查找的字段。应与引用视图上的URL关键字参数相对应。默认值为'pk'
lookup_url_kwarg - 在url conf中定义的关键字参数的名称,该名称对应于查找字段。默认使用与lookup_field相同的值。
format - 如果使用格式后缀,则超链接字段将对目标使用相同的格式后缀,除非使用 format参数重写。

1.4 SlugRelatedField

SlugRelatedField可用于使用目标上的字段来表示关系的目标。
例如,以下序列化程序:

class AlbumSerializer(serializers.ModelSerializer):tracks = serializers.SlugRelatedField(many=True,read_only=True,slug_field='title')class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将被序列化为如下表示形式:

{'album_name': 'Dear John','artist': 'Loney Dear','tracks': ['Airport Surroundings','Everything Turns to You','I Was Only Going Out',...]
}

默认情况下,此字段是读写的,尽管您可以使用 read_only 标志更改此行为。

当使用SlugRelatedField作为读写字段时,通常需要确保 slug 字段对应于unique=True的模型字段。


参数:

  • slug_field - 目标上用来表示目标的字段。这应该是一个唯一标识任何给定实例的字段。例如,username。必需

  • queryset - 验证字段输入时用于模型实例查找的queryset。关系必须显式设置查询集,或者设置read_only=True

  • many - 如果应用于多对多关系,则应将此参数设置为True。

  • allow_null - 如果设置为True,则字段将接受None值或可为null关系的空字符串。默认为False

1.5 HyperlinkedIdentityField

此字段可以作为标识关系应用,例如 HyperlinkedModelSerializer 上的 'url'字段。它也可以用于对象上的属性。例如,以下序列化程序:

class AlbumSerializer(serializers.HyperlinkedModelSerializer):track_listing = serializers.HyperlinkedIdentityField(view_name='track-list')class Meta:model = Albumfields = ['album_name', 'artist', 'track_listing']

将会被序列化为如下表达式:

{'album_name': 'The Eraser','artist': 'Thom Yorke','track_listing': 'http://www.example.com/api/track_list/12/',
}

此字段始终是只读的。


参数:

  • view_name - 应用作关系目标的视图名称。如果您使用的是标准路由器类,这将是一个格式为 <model_name>-detail 的字符串。必需。
  • lookup_field - 目标上应用于查找的字段。应与引用视图上的URL关键字参数相对应。默认值为 'pk'
  • lookup_url_kwarg - 在url conf中定义的关键字参数的名称,该名称对应于查找字段。默认使用与 lookup_field 相同的值。
  • format - 如果使用格式后缀,则超链接字段将对目标使用相同的格式后缀,除非使用format 参数重写。

2 嵌套关系

与前面讨论的对另一个实体的引用相反,被引用的实体也可以嵌入或嵌套在引用它的对象的表示中。这种嵌套关系可以通过使用序列化程序作为字段来表示。

如果该字段用于表示多对多关系,则应将many=True标志添加到序列化程序字段中。

2.1 示例

class TrackSerializer(serializers.ModelSerializer):"""歌曲序列化器"""class Meta:model = Trackfields = ['order', 'title', 'duration']class AlbumSerializer(serializers.ModelSerializer):"""专辑序列化器"""tracks = TrackSerializer(many=True, read_only=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将序列化为如下嵌套表达式:

>>> album = Album.objects.create(album_name="The Grey Album", artist='Danger Mouse')
>>> Track.objects.create(album=album, order=1, title='Public Service Announcement', duration=245)
<Track: Track object>
>>> Track.objects.create(album=album, order=2, title='What More Can I Say', duration=264)
<Track: Track object>
>>> Track.objects.create(album=album, order=3, title='Encore', duration=159)
<Track: Track object>
>>> serializer = AlbumSerializer(instance=album)
>>> serializer.data
{'album_name': 'The Grey Album','artist': 'Danger Mouse','tracks': [{'order': 1, 'title': 'Public Service Announcement', 'duration': 245},{'order': 2, 'title': 'What More Can I Say', 'duration': 264},{'order': 3, 'title': 'Encore', 'duration': 159},...],
}

2.2 可写嵌套序列化程序

默认情况下,嵌套的序列化程序是只读的。如果您想支持对嵌套序列化程序字段的写操作,则需要创建 create() 和/或 update() 方法,以便显式指定应如何保存子关系:

class TrackSerializer(serializers.ModelSerializer):"""歌曲序列化器"""class Meta:model = Trackfields = ['order', 'title', 'duration']class AlbumSerializer(serializers.ModelSerializer):"""专辑序列化器"""tracks = TrackSerializer(many=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']def create(self, validated_data):tracks_data = validated_data.pop('tracks')album = Album.objects.create(**validated_data)for track_data in tracks_data:Track.objects.create(album=album, **track_data)return album>>> data = {'album_name': 'The Grey Album','artist': 'Danger Mouse','tracks': [{'order': 1, 'title': 'Public Service Announcement', 'duration': 245},{'order': 2, 'title': 'What More Can I Say', 'duration': 264},{'order': 3, 'title': 'Encore', 'duration': 159},],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>

3 自定义关系字段

在极少数情况下,现有的关系样式都不适合您需要的表示形式,您可以实现一个完全自定义的关系字段,该字段准确地描述了如何从 model instance 生成输出表示形式。

要实现自定义关系字段,您应该重写 RelatedField,并实现 .to_representation(self, value) 方法。此方法将字段的目标作为值参数,并应返回用于序列化目标的表示形式。值参数通常是一个模型实例。

如果要实现读写关系字段,还必须实现 .to_internal_value(self,data) 方法。

要提供基于上下文的动态查询集,还可以重写 .get_queryset(self),而不是在类上或初始化字段时指定 .queryset

3.1 示例

例如,我们可以定义一个关系字段,使用其 order 顺序、title 标题和 dration 持续时间将歌曲序列化为自定义字符串表示:

import timeclass TrackListingField(serializers.RelatedField):def to_representation(self, value):duration = time.strftime('%M:%S', time.gmtime(value.duration))return 'Track %d: %s (%s)' % (value.order, value.title, duration)class AlbumSerializer(serializers.ModelSerializer):tracks = TrackListingField(many=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']

将会序列化为如下表示形式:

{'album_name': 'Sometimes I Wish We Were an Eagle','artist': 'Bill Callahan','tracks': ['Track 1: Jim Cain (04:39)','Track 2: Eid Ma Clack Shaw (04:19)','Track 3: The Wind and the Dove (04:34)',...]
}

4 自定义超链接字段

在某些情况下,您可能需要自定义超链接字段的行为,以便表示需要多个查找字段的URL。
您可以通过覆盖 HyperlinkedRelatedField 来实现这一点。有两种方法可以被重写:

get_url(self、obj、view_name、request、format)

get_url 方法用于将对象实例映射到其 url 表示形式。

如果 view_namelookup_field 属性未配置为正确匹配URL conf,则可能引发NoReverseMatch

get_object(self、view_name、view_args、view_kwargs)

如果您想支持可写的超链接字段,那么您还需要覆盖 get_object,以便将传入的URL映射回它们所代表的对象。对于只读超链接字段,不需要重写此方法。

此方法的返回值应该是与匹配的URL-conf参数相对应的对象。

可能引发ObjectDoesNotExist异常。

4.1 示例

假设我们有一个 customer object 的URL,它接受两个关键字参数,如下所示:

/api/<organization_slug>/customers/<customer_pk>/

这不能用默认实现来表示,默认实现只接受单个查找字段。

在这种情况下,我们需要覆盖HyperlinkedRelatedField以获得我们想要的行为:

from rest_framework import serializers
from rest_framework.reverse import reverseclass CustomerHyperlink(serializers.HyperlinkedRelatedField):# We define these as class attributes, so we don't need to pass them as arguments.view_name = 'customer-detail'queryset = Customer.objects.all()def get_url(self, obj, view_name, request, format):url_kwargs = {'organization_slug': obj.organization.slug,'customer_pk': obj.pk}return reverse(view_name, kwargs=url_kwargs, request=request, format=format)def get_object(self, view_name, view_args, view_kwargs):lookup_kwargs = {'organization__slug': view_kwargs['organization_slug'],'pk': view_kwargs['customer_pk']}return self.get_queryset().get(**lookup_kwargs)

请注意,如果要将此样式与通用视图一起使用,则还需要覆盖视图上的 .get_object,以便获得正确的查找行为。

一般来说,我们建议在可能的情况下为API表示使用平面样式,但在适度使用时,嵌套URL样式也是合理的。

5 进一步说明

5.1 The queryset argument

queryset 参数只对可写关系字段是必需的,在这种情况下,它用于执行从原始用户输入映射到模型实例的模型实例查找。

在2.x版本中,如果正在使用 ModelSerializer 类,序列化程序类有时可以自动确定 queryset 参数。
此行为现在被替换为始终使用可写关系字段的显式查询集参数。
这样做可以减少 ModelSerializer 提供的隐藏“魔法”数量,使字段的行为更加清晰,并确保在使用 ModelSerializer 快捷方式或使用完全显式的 Serializer 类之间切换是微不足道的。

5.2 自定义HTML显示

The built-in __str__ method of the model will be used to generate string representations of the objects used to populate the choices property.

这些选择用于在可浏览的API中填充 select HTML input

要为此类输入提供自定义表示,请重写 RelatedField 子类的 display_value()。此方法将接收一个模型对象,并应返回一个适合表示它的字符串。例如:

class TrackPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):def display_value(self, instance):return 'Track: %s' % (instance.title)

5.3 Select field 截断

当在可浏览的API中呈现时,关系字段将默认为最多只显示1000个可选项。如果存在更多项目,则将显示一个禁用选项,其中包含“超过1000个项目…”。

此行为旨在防止模板由于显示了大量关系而无法在可接受的时间跨度内进行渲染。

有两个关键字参数可用于控制此行为:

html_cutoff-如果设置,这将是html选择下拉菜单显示的最大选择数。设置为“无”可禁用任何限制。默认值为1000。

html_cutoff_text-如果设置此项,则如果html选择下拉菜单中的最大项目数已被截断,则会显示一个文本指示符。默认为“超过{count}个项目…”

您也可以使用设置HTML_SELECT_CUTOFF_TEXT全局控制这些。

在强制执行截断的情况下,您可能希望在HTML表单中使用纯输入字段。您可以使用style关键字参数来执行此操作。例如:

assigned_to = serializers.SlugRelatedField(queryset=User.objects.all(),slug_field='username',style={'base_template': 'input.html'}
)

5.4 反向关系

请注意,ModelSerializer和HyperlinkedModelSerializeer类不会自动包含反向关系。若要包含反向关系,必须将其显式添加到字段列表中。例如:

class AlbumSerializer(serializers.ModelSerializer):class Meta:fields = ['tracks', ...]

通常,您需要确保在关系上设置了一个适当的related_name参数,可以用作字段名。例如:

class Track(models.Model):album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)...

如果没有为反向关系设置相关名称,则需要在fields参数中使用自动生成的相关名称。例如:

class AlbumSerializer(serializers.ModelSerializer):class Meta:fields = ['track_set', ...]

5.5 一般关系

如果要序列化通用外键,则需要定义一个自定义字段,以明确确定如何序列化关系的目标。

例如,给定标签的以下模型,该模型与其他任意模型具有通用关系:

class TaggedItem(models.Model):"""Tags arbitrary model instances using a generic relation.See: https://docs.djangoproject.com/en/stable/ref/contrib/contenttypes/"""tag_name = models.SlugField()content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)object_id = models.PositiveIntegerField()tagged_object = GenericForeignKey('content_type', 'object_id')def __str__(self):return self.tag_name

以及以下两个模型,它们可能具有关联的标签:

class Bookmark(models.Model):"""A bookmark consists of a URL, and 0 or more descriptive tags."""url = models.URLField()tags = GenericRelation(TaggedItem)class Note(models.Model):"""A note consists of some text, and 0 or more descriptive tags."""text = models.CharField(max_length=1000)tags = GenericRelation(TaggedItem)

我们可以定义一个自定义字段,该字段可用于序列化标记的实例,使用每个实例的类型来确定应如何序列化:

class TaggedObjectRelatedField(serializers.RelatedField):"""A custom field to use for the `tagged_object` generic relationship."""def to_representation(self, value):"""Serialize tagged objects to a simple textual representation."""if isinstance(value, Bookmark):return 'Bookmark: ' + value.urlelif isinstance(value, Note):return 'Note: ' + value.textraise Exception('Unexpected type of tagged object')

如果需要关系的目标具有嵌套表示,则可以在 .to_representation() 方法中使用所需的序列化程序:

    def to_representation(self, value):"""Serialize bookmark instances using a bookmark serializer,and note instances using a note serializer."""if isinstance(value, Bookmark):serializer = BookmarkSerializer(value)elif isinstance(value, Note):serializer = NoteSerializer(value)else:raise Exception('Unexpected type of tagged object')return serializer.data

请注意,使用 GenericRelation 字段表示的反向泛型键可以使用常规关系字段类型进行序列化,因为关系中目标的类型总是已知的。
有关更多信息,请参阅关于通用关系的Django文档

5.6 ManyToManyFields with a Through Model

默认情况下,以指定了 Through Model 的 ManyToManyField 为目标的关系字段设置为只读。

如果显式指定指向具有 Through Model 的ManyToManyField的关系字段,请确保将 read_only 设置为 True

如果希望表示Through Model 上的额外字段,则可以将直通模型序列化为嵌套对象。

6 第三方软件包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用凌鲨进行内网穿透

为了方便在本地进行开发和调试工作&#xff0c;有时候需要安全地连接内网或Kubernetes集群中的服务。 在net proxy server中可以限制访问用户&#xff0c;也可以设置端口转发的密码。 使用 连接端口转发服务 列出可转发端口 可转发端口是服务端设置的&#xff0c;不会暴露真…

自恋的领导

自恋的领导》&#xff1f;&#xff1f;&#xff1f; 在职场中&#xff0c;我曾经遇到过一位自恋狂的领导。他总是自吹自擂&#xff0c;自我标榜&#xff0c;而且对团队合作态度消极&#xff0c;经常拖后腿。他的言行举止充满了负能量&#xff0c;让人感到非常不舒服。例如&…

13 OAuth2.0实战:微服务接收身份信息

上一节介绍了网关层面的统一认证鉴权,将解析过的身份信息加密放入请求头传递给下游微服务; 那么下游微服务如何接收网关传递的身份信息? 很简单,只需要在每个服务的过滤器中从请求头接收,将其解密。 木谷博客系统中是将该过滤器统一放在blog-common-starter中,这样后续…

锁表的原因及解决办法

引言 作为开发人员&#xff0c;我们经常会和数据库打交道。 当我们对数据库进行修改操作的时候&#xff0c;例如添加字段&#xff0c;更新记录等&#xff0c;没有正确评估该表在这一时刻的使用频率&#xff0c;直接进行修改&#xff0c;致使修改操作长时间无法响应&#xff0…

2023年【起重机司机(限桥式起重机)】报名考试及起重机司机(限桥式起重机)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【起重机司机(限桥式起重机)】报名考试及起重机司机(限桥式起重机)考试资料&#xff0c;包含起重机司机(限桥式起重机)报名考试答案和解析及起重机司机(限桥式起重机)考试资料练习。安全生产模拟考试一点通结合…

正是阶段高等数学复习--函数极限的计算

之前在预备阶段中函数极限的解决方式分三步&#xff0c;第一步观察形式并确定用什么方式来解决&#xff0c;第二步化简&#xff0c;化简方式一共有7种&#xff0c;分别是最重要的三种&#xff08;等价替换、拆分极限存在的项、计算非零因子&#xff09;以及次重要的4种&#xf…

vGPU_unlock实现消费级显卡虚拟化

vGPU_unlock实现显卡虚拟化 机器详情换源(清华源)配置引导文件配置内核添加禁止nouveau模块设置内核参数,以便虚拟机使用PCI设备的直通功能更新所有已经有 initramfs 的内核版本的 initramfs 镜像下载所需的软件拉取代码初次验证创建用于vGPU解锁的文件下载vgpu所需的驱动安…

BurpSuite 请求/响应解密插件开发

BurpSuite 请求/响应解密插件开发 本文主要记录如何利用burp官方的新版API即MontoyaApi 写一个请求/响应的解密插件。背景下面是主要的操作步骤&#xff1a;根据上述操作做完之后&#xff0c;生成&#xff0c;然后在burp中加载插件&#xff0c;然后通关抓包看效果&#xff0c;具…

DevEco Studio 调整开发工具中的字体大小与行高

我们打开编辑器 选择 左上角 File 下的 Settings 将左侧菜单栏 编辑 展开 我们在编辑下面 选择 Font 然后 如下图指向的两个位置 我们可以调整它的字体大小和行高 设置好之后 右下角 点击 Apply 应用 然后点击 OK即可 当然 你按着 Ctrl 然后鼠标滚动 也可以像浏览器那样 拉…

维基百科文章爬虫和聚类:高级聚类和可视化

一、说明 维基百科是丰富的信息和知识来源。它可以方便地构建为带有类别和其他文章链接的文章&#xff0c;还形成了相关文档的网络。我的 NLP 项目下载、处理和应用维基百科文章上的机器学习算法。 在我的上一篇文章中&#xff0c;KMeans 聚类应用于一组大约 300 篇维基百科文…

Spring IOC—基于XML配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、通过类型来获取Bean 0.总述&#xff08;重要&#xff09; : 1.基本介绍 : 2.应用实例 : 三、通过指定构造器为Bean注入属性 1.基本介绍 : 2.应用实例 : 四、通过p命名空间为Bean注入属性 1.基本介绍 : 2.应用实例 : 五、通过ref引用实现Bean的相…

吸烟(抽烟)检测和识别2:Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码)

吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 目录 吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 1.吸烟(抽烟)检测和识别 2.吸烟(抽烟)数据集 &#xff08;1&am…

c++中函数的引用

函数中的引用 引用可以作为函数的形参 不能返回局部变量的引用 #include<iostream> #include<stdlib.h> using namespace std; //形参是引用 void swap(int *x, int *y)//*x *y表示对x y取地址 { int tmp *x; *x *y; *y tmp; } void test01() { …

用两个栈实现队列

目录 一、栈的基本结构及其接口 二、我的队列结构定义 三、我的队列创建及其初始化 四、我的队列入队 五、我的队列出队 六、我的队列取队头元素 七、我的队列判空 八、我的队列销毁 一、栈的基本结构及其接口 //栈的结构定义 typedef int STDataType;typedef struct St…

OpenGL ES入门教程(三)之为平面桌子添加混合色

OpenGL ES入门教程&#xff08;三&#xff09;之为平面桌子添加渐变色 前言零、OpenGL ES实现混合色的原理一、修改绘制的桌子结构1. 三角形扇介绍2. 基于三角形扇结构绘制平面桌子 二、为每个顶点添加颜色属性三、修改着色器1. 顶点着色器2. 片段这色器 四、绘制具有混合颜色的…

7.24 SpringBoot项目实战【审核评论】

文章目录 前言一、编写控制器二、编写服务层三、Postman测试前言 我们在 上文 7.23 已经实现了 评论 功能,本文我们继续SpringBoot项目实战 审核评论 功能。逻辑如下: 一是判断管理员权限,关于角色权限校验 在 7.5 和 7.6 分别基于 拦截器Interceptor 和 切面AOP 都实现过…

Qt OpenCV 学习(二):两个简单图片识别案例

1. 寻找匹配物体 1.1 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <opencv2/opencv.hpp>#include <QImage> #include <QString> #include <QPixmap>QT_BEGIN_NAMESPACE namespace Ui { class Main…

TimeGPT:时序预测领域终于迎来了第一个大模型

时间序列预测领域在最近的几年有着快速的发展&#xff0c;比如N-BEATS、N-HiTS、PatchTST和TimesNet。 大型语言模型(llm)最近在ChatGPT等应用程序中变得非常流行&#xff0c;因为它们可以适应各种各样的任务&#xff0c;而无需进一步的训练。 这就引出了一个问题:时间序列的…

速达软件全系产品存在任意文件上传漏洞 附POC

@[toc] 速达软件全系产品存在任意文件上传漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。…