Django多对多字段有排序关系的直接替换方案。
项目描述
sortedm2m 是django自带的 ManyToManyField 的直接替换方案。提供的 SortedManyToManyField 的行为与原始的一个一样,但会记住添加关系的顺序。
使用案例
想象一下,你有一个画廊模型和一个照片模型。通常,你希望在这些模型之间建立关系,以便可以向一个画廊添加多个照片,同时也希望能够在许多画廊中使用相同的照片。
这就是你通常可以使用多对多关系的地方。缺点是django的默认实现不提供对画廊中照片进行排序的方法。所以你只有随机的排序,这在大多数情况下都是不适合的。
您可以通过使用本包提供的SortedManyToManyField作为Django的ManyToManyField的替代品来解决这个问题。
要求
django-sortedm2m在Python 3.6+以及多个Django版本上运行。请参阅.github/workflows/test.yml配置以获取测试过的Django版本。
用法
在您的模型中使用SortedManyToManyField就像使用ManyToManyField一样。
from django.db import models
from sortedm2m.fields import SortedManyToManyField
class Photo(models.Model):
name = models.CharField(max_length=50)
image = models.ImageField(upload_to='...')
class Gallery(models.Model):
name = models.CharField(max_length=50)
photos = SortedManyToManyField(Photo)
如果您在代码中使用关系,如以下所示,它将记住您添加到相册中的照片的顺序。
gallery = Gallery.objects.create(name='Photos ordered by name')
for photo in Photo.objects.order_by('name'):
gallery.photos.add(photo)
SortedManyToManyField
您可以使用以下参数来修改默认行为
sorted
默认值: True
您可以将sorted设置为False,这将强制SortedManyToManyField表现得像Django的原始ManyToManyField。关系上不会执行排序,中间表也不会有一个数据库字段来存储排序信息。
sort_value_field_name
默认值: 'sort_value'
指定通过哪个字段在中间数据库表中按顺序排序。如果您需要将旧数据库集成到您的应用程序中,您可以更改其名称。
base_class
默认值: None
您可以将base_class(有序m2m关系模型的通过模型的基础类)设置为包含一个__str__方法的抽象基类,以改进有序m2m关系的字符串表示。
将ManyToManyField迁移为SortedManyToManyField
如果您正在使用Django的迁移框架,并希望将ManyToManyField更改为SortedManyToManyField(或相反),您会发现Django的makemigrations创建的迁移不会按预期工作。
为了将ManyToManyField迁移为SortedManyToManyField,您需要将模型中的字段更改为SortedManyToManyField,并使用manage.py makemigrations创建一个新的迁移。在应用它之前,编辑迁移文件,并在operations列表中将migrations.AlterField更改为AlterSortedManyToManyField(从sortedm2m.operations导入)。此操作将处理更改中间表、添加排序字段并填充默认值。
管理界面
SortedManyToManyField提供了一个自定义小部件,可以用于对选定的项目进行排序。它渲染一个可以拖放排序的复选框列表。
要在管理界面中使用小部件,您需要将sortedm2m添加到您的INSTALLED_APPS设置中,如下所示
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'sortedm2m',
'...',
)
否则,它将找不到所需的css和js文件来执行拖放排序。
最后,请确保不要在ModelAdmin定义中列出任何filter_horizontal或filter_vertical元组。
如果您正确操作,最终结果将类似于以下内容
还可以在《ModelAdmin》定义中使用管理员选项的《SortedManyToManyField》和《raw_id_fields》。将《SortedManyToManyField》的名称添加到该列表中,即可得到一个简单的文本输入字段。输入框中输入的id顺序用于对排序的多对多关系项进行排序。
示例
from django.contrib import admin
class GalleryAdmin(admin.ModelAdmin):
raw_id_fields = ('photos',)
贡献
这是一个Jazzband项目。通过贡献,您同意遵守《贡献者行为准则》并遵循《指南》。
您可以在Github上找到最新的开发版本。前往那里进行分支操作,报告错误或发送祝福。
运行测试
我建议使用《tox》一次性运行所有相关Python版本的测试。因此,使用
pip install tox
安装《tox》,然后在《django-sortedm2m》检出的根目录中输入。tox
测试是在SQLite、然后是PostgreSQL、然后是MySQL上运行的,因此您需要在您的开发环境中安装PostgreSQL和MySQL,并为两者设置一个名为
sortedm2m
的角色/用户。代码质量
该项目使用isort、pycodestyle和pylint来管理代码质量验证。可以使用以下命令运行这些验证:
tox -e quality
变更日志
4.0.0
3.1.1
#191:修复了Django管理中弹出窗口的JS错误
3.1.0
3.0.2
#168:恢复了
admin/js/jquery.init.js
3.0.1
3.0.0
2.0.0
1.5.0
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
#75: 修复“添加另一个”admin弹窗。在Django 1.8+中没有刷新项目列表。感谢Vadim Sikora提供的补丁。
1.2.1
跳过
1.2.0
停止支持Python 3.2。它已于2016年2月达到生命周期的尽头。
1.1.2
#71:不要在某些情况下破坏collectstatic。因此,我们从SortedCheckboxSelectMultiple中的表单媒体定义中移除了STATIC_URL前缀。感谢Kirill Ermolov提供的补丁。
1.1.1
#70: 为Django 1.9新管理设计修复CSS。感谢Maarten Draijer提供的补丁。
1.1.0
1.0.2
#56:修复添加对象后顺序错误的问题。这与使用m2m对象的count作为下一个sort_value值有关。我们现在使用正确的Max聚合来确保新添加的对象将按顺序排列。感谢Scott Kyle的报告和补丁。
1.0.1
已修复排序m2m管理小部件的性能问题。请参阅#54以获取详细信息。感谢Jonathan Liuti修复此问题。
1.0.0
太棒了,我们正式宣布django-sortedm2m已稳定,并承诺向后兼容新版本(在这方面我们从一开始就做得很好)。
支持Django 1.8的AlterSortedManyToManyField操作。感谢Nicolas Trésegnie开始实现。
0.10.0
现在,排序m2m中间模型和数据库表的创建全部在SortedManyToManyField类内完成。这使得在创建自定义子类时修改此创建变得更加容易。请参阅#49以获取示例用例。
在Django 1.7迁移中添加对自定义字段参数如sorted和sort_value_field_name的支持。感谢Christian Kohlstedde提供的补丁。
0.9.5
修复了在默认编码不是UTF-8的系统上运行时的setup.py问题。请参阅#48以获取详细信息。感谢Richard Mitchell提供的补丁。
0.9.4
修复:SortedMultipleChoiceField没有正确报告数据对Form.changed_data的更改。感谢@smcoll提供的补丁。
0.9.3
修复:AlterSortedManyToManyField操作在PostgreSQL数据库中失败。
针对MySQL数据库进行测试。
0.9.2
修复:AlterSortedManyToManyField操作在许多已包含一些数据的多对多字段中失败。
0.9.1
修复:当使用可排序的管理小部件时,取消选中列表中的项目没有效果。感谢madEng84的报告和补丁!
0.9.0
添加AlterSortedManyToManyField迁移操作,允许您从ManyToManyField迁移到SortedManyToManyField,反之亦然。感谢Joaquín Pérez提供的补丁!
修复:支持Django 1.7.4的迁移。
修复:对于动态添加的内联表单,管理小部件不再损坏。感谢Rubén Díaz提供的补丁!
0.8.1
添加对Django 1.7迁移的支持。感谢Patryk Hes和Richard Barran的报告。
添加捷克语翻译。感谢@cuchac提供的拉取请求。
0.8.0
添加对Django 1.7的支持,并放弃对Django 1.4的支持。
0.7.0
添加对prefetch_related()的支持。感谢Marcin Ossowski的想法和补丁。
0.6.1
正确转义排序m2m小部件标签中的for属性。感谢Mystic-Mirage的报告和修复。
0.6.0
支持Python 3!
更好的小部件。感谢Mike Knoop提供的初始补丁。
0.5.0
支持Django 1.5。感谢Antti Kaihola提供的补丁。
放弃对Django 1.3的支持。如果您需要使用Django 1.3,请使用django-sortedm2m<0.5。
在SortedManyToManyField中添加对sort_value_field_name参数的支持。感谢Trey Hunner的想法。
0.4.0
支持Django 1.4。感谢Flavio Curella提供的补丁。
仅当south实际上在您的INSTALLED_APPS设置中时,south支持才启用。感谢tcmb的报告和Florian Ilgenfritz提供的补丁。
0.3.3
南支持(通过monkeypatching,但无论如何……它在那里!)。感谢Chris Church提供的补丁。不过,South迁移不会拾取更改的sorted参数。
0.3.2
在全局范围内使用已包含的jQuery版本,而不是使用django的版本。感谢Hendrik van der Linde报告此问题。
0.3.1
修复了打包错误。
0.3.0
进行了大量内部重构。这些重构是为了解决与SortedManyToManyField和对'self'的引用有关的问题。
0.2.5
忘记从代码中排除调试打印/控制台.log语句。抱歉。
0.2.4
修复了SortedCheckboxSelectMultiple小部件的问题,特别是在有“创建并添加另一个项目”弹出窗口的admin中。
0.2.3
修复了在SortedRelatedManager中.add()和.remove()方法使用主键而不是模型实例的问题。
0.2.2
修复了SortedCheckboxSelectMultiple的验证错误。如果只传递一个值,则会引发错误。
0.2.1
从SortedCheckboxSelectMultiple中移除了不必要的jquery ui css文件引用。感谢Klaas van Schelven和Yuwei Yu的提示。
0.2.0
添加了一个用于admin的widget。
项目详情
哈希值 for django_sortedm2m-4.0.0-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7e76f3f3ea3184b4ca1d4043ec75316c606d00f5534fc71e69981d8b2198ff33 |
|
MD5 | 551d1f5a49c035469fcdbb690376c860 |
|
BLAKE2b-256 | 4f59368d68a415b2818dcf95044a14caa435d0140960be3b23ea8b264c8afda7 |