Джанго Отношения между несколькими полями - PullRequest
0 голосов
/ 27 апреля 2011

Мне просто нужна небольшая помощь, чтобы обдумать это, если кто-то может быть таким добрым.

class object_a(models.Model):
  foo = models.blah
  bar = models.blah

class object_b(models.Model):
  foop = models.blah
  barp = models.blah

В другой модели у меня есть класс, для которого я хочу иметь одно отношение с обоими полями. Например, в администраторе я хочу, чтобы список объектов object_a и object_b можно было выбрать в некотором роде отношений.

Я знаю, что родовые отношения какого-то рода могут сделать это, но я просто не могу до конца понять, что. вся помощь приветствуется.

Спасибо.

1 Ответ

3 голосов
/ 27 апреля 2011

Используйте инфраструктуру типов содержимого , предоставленную Django:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

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

Затем вы можете создать некоторые из своих основных объектов:

>>> from myapp.models import object_a, object_b, Other
>>> a = object_a()
>>> a.foo = 'test'
>>> a.bar = 'value'
>>> a.save()
>>> b = object_b()
>>> b.foop = 'random'
>>> b.barp = 'values'
>>> b.save()

И затем сохранить ссылки наих в Other объектах:

>>> o1 = Other()
>>> o1.content_object = a
>>> o1.save()
>>> o2 = Other()
>>> o2.content_object = b
>>> o2.save()

Теперь, если мы запросим все Other объекты и проверим их:

>>> all = Other.objects.all()
>>> all[0].content_object
<object_a: object_a object>
>>> all[0].content_object.foo
u'test'
>>> all[1].content_object
<object_b: object_b object>
>>> all[1].content_object.foop
u'random'

Просматривая поля на Otherобъект, мы можем видеть, как Django хранит общие отношения:

>>> all[0].content_type
<ContentType: object_a>
>>> all[0].object_id
1

Когда вы запускаете команду syncdb для установки ваших моделей, Django создает уникальный объект ContentType для каждой модели.Когда вы используете общие отношения, вы сохраняете внешний ключ к этой записи типа контента (определяющий, какой тип объекта находится на другом конце отношения), и уникальный идентификатор экземпляра модели.Поле generic.GenericForeignKey не хранится в базе данных, но является оболочкой, которая принимает тип контента и идентификатор объекта и получает фактический объект для вас.

...