Моделирование отношения к мета-таблице с 2 первичными ключами - PullRequest
1 голос
/ 25 января 2011

Я очень новичок в Django и буду признателен за помощь в решении этой проблемы:

У меня есть таблица с метаинформацией (например, количество кликов, голосов, комментариев ...) для разных областей моего сайта (новости, события в календаре, фильмы ...). На таблицу ссылаются два первичных ключа (fi = INTEGER и tbl = CHAR).

class News(models.Model):
    title = models.CharField()
    ...
class Film(models.Model):
    title = models.Charfield()
    ...
class Calendar(models.Model):
    title = models.Charfield()
    ...

class MetaInfo(models.Model):
    fi  = ForeignKey(??) # Integer
    tbl = ForeignKey(??) # CharField

Пример: fi = 1 и tbl = 'news' будут относиться к записи новостей с первичным ключом 1. И fi = 100, tbl = 'film' будет относиться к записи фильма с первичным ключом 100.

Как это сделать? Возможно ли это даже с django?

1 Ответ

1 голос
/ 25 января 2011

Django имеет встроенную функцию под названием Generic Foreign Keys , которая позволяет вам привязать одну таблицу к нескольким моделям таким способом.

Вот как вы будете создавать свои модели:

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

class News(models.Model):
    title = models.CharField()
    ...
class Film(models.Model):
    title = models.Charfield()
    ...
class Calendar(models.Model):
    title = models.Charfield()
    ...

class MetaInfo(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()

    content_object = generic.GenericForeignKey()

Если хотите, вы можете более подробно рассказать о связи между моделью и MetaInfo, используя GenericRelation.Например:

class Film(models.Model):
    title = models.CharField()
    metainfo = generic.GenericRelation('MetaInfo')
    ...

Это позволяет вам получить доступ к соответствующим записям MetaInfo непосредственно из модели фильма, как в

f = Film.objects.get(pk=1)
for mi in f.metainfo.all():
    #mi is a matching MetaInfo record for Film record with pk=1

Просто немного уточнить:

В модели MetaInfo content_type служит эквивалентом вашего столбца tbl (хотя он указывает на конструкцию Django, называемую ContentType; Django создает ее для каждой модели в приложении / наборе приложений), а object_id соответствует вашему ключу fi.На самом деле вы вообще не обращаете особого внимания на эти поля.Вместо этого вы получаете и устанавливаете объект содержимого, который является соответствующей записью.Например, вместо сохранения или извлечения tlb = 'Film', fi = 1, вы получите или установите content_object, который непосредственно соответствует записи фильма, соответствующей pk = 1.

По сути, contenttype__name='Film', object_id=1 в то время какcontent_object=Film.object.get(pk=1)

Все это предполагает, что эта база данных предназначена только для Django.Если это существующая база данных, которую вы пытаетесь использовать в Django, я не знаю простого способа справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...