跳转到主要内容

Django多对多字段有排序关系的直接替换方案。

项目描述

Jazzband PyPI Release Build Status Code coverage

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_horizontalfilter_vertical元组。

如果您正确操作,最终结果将类似于以下内容

http://i.imgur.com/HjIW7MI.jpg

还可以在《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

的角色/用户。

代码质量

该项目使用isortpycodestylepylint来管理代码质量验证。可以使用以下命令运行这些验证:

tox -e quality

变更日志

4.0.0

  • #216:放弃了对过时版本的Django和Python的支持

  • #215:增加了对Django 5.1的支持

3.1.1

  • #191:修复了Django管理中弹出窗口的JS错误

3.1.0

  • #178:修复了错误

  • #178:修复了Pylint错误

  • #175:修复了jQuery UI错误

  • #183:迁移到GitHub Actions进行CI

  • #184:增加了对Django 3.2的支持

3.0.2

  • #168:恢复了

    admin/js/jquery.init.js

3.0.1

  • #164:将所有地区添加到可分发文件中

  • #162:将缺失的文件添加到

    MANIFEST.in

    ,并删除

    .DS_Store

    文件

  • #150:添加了德语和西班牙语翻译

  • #149:从

    SortedCheckboxSelectMultiple

    中移除了

    admin/js/jquery.init.js

3.0.0

  • #147:放弃了对Django 2.0的支持

  • #152:放弃了对Django 1.10的支持

  • #152:添加了对Python 3.8的支持

  • #152:添加了对Django 3.0的支持

2.0.0

  • #135:更新了README中的Jazzband详细信息,并添加了

    CONTRIBUTING.md

  • #136:放弃了对Python 2.6和3.3的支持,以及Django < 1.11

  • #130:增加了对Python 3.7和Django 2.0到2.2的支持

  • #130:添加了对自定义through模型的支撑(仅适用于Django >= 2.2)

  • #138: 添加覆盖率报告

1.5.0

  • #101: 为多对多中间类添加自定义基类支持。请参阅README获取文档。感谢Rohith Asrk提供的补丁。

  • #87: 修复AlterSortedManyToManyField操作以支持自定义_sort_field_name集合。

1.4.0

  • #104: 添加对Django 1.10和1.11的兼容性!感谢Frankie Dintino提供的补丁。

  • #94: 添加法语翻译文件。主要用于admin中的字符串。感谢ppython提供的补丁。

  • #93: 防止用户意外导入并使用ManyToManyField而不是从sortedm2m导入并使用SortedManyToManyField。感谢Dayne May提供的补丁。

1.3.3

  • #91 & #92: 修复与Django 1.10一起使用时的admin小部件,添加新项目弹窗未关闭。感谢Tipuch提供的补丁。

1.3.2

  • #80 & #83: 修复当验证值为None时的SortedMultipleChoiceField.clean。感谢Alex Mannhold提供的补丁。

1.3.1

  • #57 & #81: 修复添加相关对象弹窗错误,防止不存在相关对象时操作。感谢Vadim Sikora的修复。

1.3.0

  • #79: 在小部件的JavaScript代码中使用.sortedm2m-item选择器来定位列表项。这之前是ul.sortedm2m li。这提高了与其他不使用ul/li标签的标记的兼容性。感谢Michal Dabski提供的补丁。

    注意:如果您使用自定义标记与JavaScript代码一起使用,您需要确保项目现在具有sortedm2m-item类名。

  • #76: 为SortedMultipleChoiceField添加对to_field_name的支持。感谢Conrad Kramer提供的补丁。

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

  • #59#65#68:支持Django 1.9。感谢Scott Kyle和Jasper Maes提供的补丁。

  • #67:支持禁用某些模型的迁移,这可以通过Django的DB路由器(使用allow_migrate_model方法)来决定。感谢@hstanev提供的补丁。

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迁移中添加对自定义字段参数如sortedsort_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。

项目详情


下载文件

下载您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

此版本没有提供源分布文件。请参阅生成分布存档的教程

构建分布

django_sortedm2m-4.0.0-py2.py3-none-any.whl (37.8 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面