python - Django 通用多对多?

标签 python django generics django-models

我想让我的图书模型同时属于多个图书馆、集合、引用文献和编辑器。是否可以用通用关系来做到这一点? 像这样:

content_type = generic.GenericManyToMany(ContentType)


from django.conf import settings
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import ugettext_lazy as _

LIBRARY_NAME_MAX_LENGTH = getattr(settings, "LIBRARY_NAME_MAX_LENGTH", 160)

class Library(models.Model):
    """


    """

    name    = models.TextField(max_length=LIBRARY_NAME_MAX_LENGTH,
                               verbose_name=_(u""))
    desc    = models.TextField()

    class Meta:
        verbose_name        = _(u"library")
        verbose_name_plural = _(u"libraries")


class Collection(models.Model):
    """


    """

    name        = models.TextField()
    description = models.TextField()
    period      = models.TextField()

    class Meta:
        verbose_name        = _(u"collection")
        verbose_name_plural = _(u"collections")

class Editor(models.Model):
    """
    blabla...

    """

class Reference(models.Model):
    """


    """

    title    = models.TextField()
    isbn     = models.TextField()
    editor   = models.ForeignKey(Editor)
    pub_date = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return _(u"%s: %s") % (self.title, self.isbn)

    class Meta:
        ordering            = "-pub_date"
        verbose_name        = _(u"reference")
        verbose_name_plural = _(u"references")

class Book(models.Model):
    """


    """

    content_type    = models.ForeignKey(ContentType)
    object_pk       = models.TextField()
    content_object  = generic.GenericForeignKey(ct_field="content_type",
                                                fk_field="object_pk")

    title   = models.TextField()
    cover   = models.TextField()
    # and some other fields

    class Meta:
        verbose_name        = _(u"book")
        verbose_name_plural = _(u"books")

最佳答案

我不认为 django 中有内置的东西,但多对多关系或多或少只是一个连接表。

一种可能的解决方案是执行以下操作:

class Book(models.Model):
    pass

class BookConnection(models.Model):
    book = models.ForeignKey(Book)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

class SomeModel(models.Model):
    pass

class SomeOtherModel(models.Model):
    pass

将书籍连接到某些模型:

>>> book = Book.objects.create()
>>> m1 = SomeModel.objects.create()
>>> m2 = SomeModel.objects.create()
>>> m3 = SomeOtherModel.objects.create()
>>> BookConnection.objects.create(book=book, content_object=m1)
>>> BookConnection.objects.create(book=book, content_object=m2)
>>> BookConnection.objects.create(book=book, content_object=m3)

关于python - Django 通用多对多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3746737/

相关文章:

python - 根据条件将列值转换为列表的列

python - django rest framework lookup_field 通过 OneToOneField

java - 如何制作一个可以容纳 Class<T> 的通用枚举?

python - Django 管理员。从 list_display 编辑用户个人资料的链接

c# - IsAssignableFrom 或 AS?

c# - 是否可以对泛型方法进行不安全的协变调用?

python - 为什么需要为 Python 设置环境变量才能使 Scrapy 工作?

python - 使用 pyqt4 在 qtextbrowser/qtextedit 中设置和获取 html 文本

python - 使用数组结构将 DataFrame 上传到 BigQuery

Django 内联外键与父主键不匹配