django模型帮助涉及m2m和foreignkey

时间:2013-01-19 22:09:01

标签: python database django models django-orm

好的,这对其他人来说可能很容易解决,但我真的很困惑如何去解决这个问题。

首先,我有一个模型A,它有多个与特定表有多对多关系的字段。例如,

class A(models.Model):
    field1 = models.ManyToMany('field1Collection')
    field2 = models.ManyToMany(field2Collection')

class field1Collection(models.Model):
    description = models.TextField()

class field2Collection(models.Model):
    description = models.TextFIeld()

无论如何,这正是我想要完成的。我需要编写另一个可以容纳排名系统的模型。例如,我想创建一个我可以定义的记录

我有x个等级(例如3个):

  1. field1Collection对象3
  2. field2Collection对象6
  3. field1Collection对象2
  4. 所以我基本上希望能够从我的field1Collection和field2Collection表中选择对象并为它们分配排名。我尝试使用foreignkeys和m2m字段来思考方案,但它们都出错了,因为模型需要知道“我需要”引用的集合集“超前”。这有多少感觉?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

你需要field1Collection和filed2Collection有一个共同的祖先类,你可以用foreignKey引用它。请参阅有关继承的django文档。

答案 1 :(得分:0)

您可以使用GenericForeignKey关系

解决此问题
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class RankItem(models.Model):
    rank = models.IntegerField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    def __unicode__(self):
        return self.rank

普通的ForeignKey只能“指向”另一个模型,这意味着如果RankItem模型使用了ForeignKey,则必须选择一个且只有一个模型来存储标签。 contenttypes应用程序提供了一种特殊的字段类型,可以解决此问题,并允许关系与任何模型