Django在管理界面中如何对有序的ManyToManyField进行排序

3

我有一个遗留数据库,其中包含文档和作者表。第三个表使用外键到文档和作者,并使用整数来指定给定文档的作者顺序来定义文档和作者之间的多对多关系。

在使用Django 1.1.1(或SVN)时,是否有办法在管理页面中编辑文档作者及其顺序?

2个回答

5
这篇翻译可能不够精细,但它应该能让你更接近目标。
from django.db import models
from django.contrib import admin

class Document(models.Model):
    name = models.CharField(max_length = 128)

    def __unicode__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length = 128)
    document = models.ManyToManyField(Document, through = 'Foo')

    def __unicode__(self):
        return self.name

class Foo(models.Model):
    document = models.ForeignKey(Document)
    author = models.ForeignKey(Author)
    author_order = models.IntegerField()

class FooInline(admin.TabularInline):
    model = Foo

class DocumentAdmin(admin.ModelAdmin):
    inlines = [ FooInline ]

admin.site.register(Author)
admin.site.register(Document, DocumentAdmin)

http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany http://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects


我之前尝试过,但是即使在 FooInline 类中指定 extra = 3,文档管理页面中只显示一个作者行/条目进行编辑。 - Luís Marques
我刚刚测试了这个(使用1.1.1版本),在添加新文档时有选项可以最初附加3个作者,编辑文档时还可以再附加3个作者。不确定你遇到了什么问题,但对我来说似乎运行良好。 - Jason Leveille
你有没有试过使用 inspectdb 命令来查看 Django 模型的表示形式(http://docs.djangoproject.com/en/dev/ref/django-admin/#inspectdb)?纯属好奇。 - Jason Leveille
好的,我已经找到了差异的原因。在我的传统数据库中,Foo表不包含“id”主键列。相反,它是基于所有三个列进行键控的,第一个键是文档ID,然后是作者ID,最后是顺序。当我在字段上放置primary_key=True时,管理页面只显示一个条目。 - Luís Marques
多字段主键从关系型数据库管理系统的角度来看确实是有意义的,但是M2M关系需要一个单一字段的主键(如果我错了,请有人纠正我)。如果您仍然想确保这3个字段的唯一性,您应该在Foo模型中使用unique_together(http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together)。 - Jason Leveille
显示剩余2条评论

0

这可能对你有所帮助 - Django中有一些实用工具,可以用来构建遗留数据库的模型。

我使用它为mediawiki数据库构建了一个模型。它大部分都是正确的,但你需要稍微调整一下模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接