Проблема в том, что я связал таблицу (Legacy) с моделями django (UserProfile) с помощью M2MField, а также через промежуточную таблицу, но, похоже, связь не сгенерирована. Устаревшая таблица — это всего лишь одна таблица без каких-либо других отношений.
Я использую дистрибутив Anaconda с Python версии 2.7, django 1.8 и PostgreSQL 9.4. Вот коды.
models.py
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
class Legacy(models.Model): # Legacy DB with no pk column
... # columns
class Meta:
managed = False
db_table = 'legacydb_name'
class UserProfile(models.Model):
user = models.OneToOneField(User)
username = models.CharField(max_length = 16)
mylegacy = models.ManyToManyField(Legacy,
through = 'Legacylink',
related_name = 'legacy_mylegacy')
def __unicode__(self):
return "%s"%(self.user, )
class Legacylink(models.Model):
userprofile = models.ForeignKey(UserProfile)
yourlegacy = models.ForeignKey(Legacy)
class Meta:
db_table = 'legacy_link'
unique_together = ('userprofile','yourlegacy')
admin.py
from django.contrib import admin
from myapp.models import UserProfile, Legacy, Legacylink
# Register your models here.
admin.site.register(UserProfile)
admin.site.register(Legacy)
admin.site.register(Legacylink)
После миграции без ошибок сгенерированная таблица UserProfile не показывает связи между UserProfile и Legacy DB. Я имею в виду, что в таблице UserProfile нет ни столбца с именем my legacy, ни таблицы с именем Legacylink.
Я много гуглил о том, как использовать ManyToManyField с устаревшей базой данных... Также я очень благодарен SO за предоставление многих подсказок, таких как unique_together, о ProgrammingError, промежуточная таблица. Я следил за многими руководствами, но не смог решить свою проблему...
Вот что я спрашиваю:
- Должна ли устаревшая БД иметь столбец идентификатора для primary_key?
- Как проверить, успешно ли создано отношение M2M?
Также я был бы признателен, если бы вы сообщили мне некоторые рекомендации по работе с устаревшей БД с помощью M2MField.