【发布时间】:2017-02-28 17:12:16
【问题描述】:
我正在尝试在 Django 中建模某些东西,但它似乎不太正确。一个Book 和一个Movie 可以包含一个或多个Persons,每个Role(如“作者”或“导演”)在Book 或Movie 上。
我正在使用Generic relations 这样做:
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255)
class Role(models.Model):
person = models.ForeignKey('Person')
role_name = models.CharField(max_length=255)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Book(models.Model):
title = models.CharField(max_length=255)
roles = GenericRelation('Role', related_query_name='books')
class Movie(models.Model):
title = models.CharField(max_length=255)
roles = GenericRelation('Role', related_query_name='movies')
这似乎可行,但是当得到所有Books 和Person 的工作时,这似乎很奇怪:
person = Person.objects.get(pk=1)
for role in person.role_set.all():
print(role.role_name)
for book in role.books.all():
print(book.title)
for book in role.books.all() 感觉不对 - 就像一个角色可以拥有多本书。我想我希望在制作特定书籍/电影的人之间建立更直接的关系。
有没有更好的建模方法?
【问题讨论】:
-
您是否考虑过通过模型使用多对多关系?例如。你的书/电影模特会通过这个角色建立多对多的关系吗?见:docs.djangoproject.com/en/1.10/topics/db/models/…
-
我认为问题在于将角色用于多个模型——书籍、音乐和其他东西——而不仅仅是一个。这就是我选择通用关系的原因。还是我误会了?
-
啊...我想我可以做
print(role.role_name, role.content_object.title)...content_object是书或电影...
标签: django django-models