2011-05-06 2 views
0

У меня есть эта модель «jobs» (показано ниже).проблема модели django с отношениями M2M и внешнего ключа

  • Существует взаимосвязь между хостами и местоположениями между M2M (в местоположении назначено несколько хостов).
  • У меня также есть класс часового пояса с ключом иностранных отношений, образованном между местоположением и часовой пояс (A место присваивается часовой пояс)

Проблема у меня в том, что я не могу не-закомментировать коло " в классе Host из-за ссылки внешнего ключа на «Местоположение». Класс Location определяется после класса Host. Но я не могу переместить определение местоположения выше класса Host из-за ссылки M2M для «хостов» в классе Location.

Мне что-то не хватает концептуально? Любая помощь будет принята с благодарностью!

Вот соответствующая часть моей модели:

class Timezone(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return "%s"%(self.name) 

class Host(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
# colo = models.ForeignKey(Location) 
    def __unicode__(self): 
     return "%s"%(self.name) 

class Location(models.Model): 
    name = models.CharField(max_length=3, unique=True) 
    hosts = models.ManyToManyField(Host, blank=True) #not required 
    tz = models.ForeignKey(Timezone) 
    def __unicode__(self): 
     return "%s"%(self.name) 

ответ

0

Поскольку хост будет только когда-либо в одном месте, вы можете удалить locations поле из модели хоста или удалить colo и изменить locations к location = models.ForeignKey(Location)

Чтобы получить все хосты из места, вы можете сделать

location = Location.objects.get(pk=1) 
hosts = location.host_set.all() #returns all hosts for the location 

Вот ссылка на Django docs about backwards relationships

+0

Ах, ха! Это именно то, что мне нужно. Я не должен беспокоиться об определении отсталых отношений в модели. Я должен использовать наборы запросов и фильтры, чтобы изменить отношения в моем представлении, когда это необходимо. Благодаря!!! – nnachefski

1

В принципе, вы не можете ссылаться на класс Расположение до того, как было определено. Поэтому, если вы переключите порядок классов Host и Location, которые помогают. Тогда отношение many to many относится к классу Host, который еще не определен. Но поскольку многие из многих отношений могут быть определены в любой из таблиц, просто переместите их в класс Host. Вот измененный код:

class Timezone(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return "%s"%(self.name) 

class Location(models.Model): 
    name = models.CharField(max_length=3, unique=True)  
    tz = models.ForeignKey(Timezone) 
    def __unicode__(self): 
     return "%s"%(self.name) 

class Host(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    colo = models.ForeignKey(Location, related_name='colocation') 
    locations = models.ManyToManyField(Location, blank=True) #not required 
    def __unicode__(self): 
     return "%s"%(self.name) 
+0

спасибо за быстрый ответ, но хост будет иметь только одно место, в котором он находится колокейшн в . – nnachefski

+0

Но у вас есть много разных отношений, определенных в вашем классе Location классу Host? –

+0

Это не связано с вашим вопросом, но вы можете проверить django-timezones для вашей модели часового пояса. У этого есть некоторые интересные особенности, которые могут уменьшить некоторую головную боль, связанную с Временными часами. https://github.com/brosner/django-timezones –

1

У вас есть отношения многие ко многим между хостами и местах, однако, что вы хотите, чтобы узлы, чтобы иметь то же место вы на самом деле хотите один ко многим отношений между хостами и местах. Это объявляется с использованием моделей. ForeignKey, которые у вас есть в вашем классе Host. Вам просто нужно повторно заказать код, чтобы класс Host появился после класса Location, позволяя вам ссылаться на него. Также вы можете удалить многие отношения.

class Timezone(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return "%s"%(self.name)  

class Location(models.Model): 
    name = models.CharField(max_length=3, unique=True) 
    tz = models.ForeignKey(Timezone) 
    def __unicode__(self): 
     return "%s"%(self.name) 

class Host(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    colo = models.ForeignKey(Location) 
    def __unicode__(self): 
     return "%s"%(self.name) 

Я не был уверен в наилучшем способе сделать это, поэтому я просто напишу еще один ответ. Мой первый ответ в основном позволил nnachefski создать модель, которую он определил в вопросе. Прочитав его комментарии, я понял, что он действительно хотел модель, которая немного отличается от той, которую он определил.

Смежные вопросы