Джанго создает отношения один ко многим - PullRequest
1 голос
/ 06 марта 2011

Я недавно начал изучать Джанго и не могу найти ответ на простой вопрос.У меня есть 2 таблицы: клиент и адрес.

------------------
CLIENT |
------------------
ID |
NAME |
ADDRES_REF |
------------------

------------------
ADDRES |
------------------
ID |
NAME |
CITY |
COLLECTION |
------------------

Соотношение между ними: client.addres_ref = addres.collection.Чтобы выбрать все адреса клиентов с идентификатором, равным 123, я должен создать такой запрос:

select addres.name, addres.city from addres, client where client.addres_ref=addres.collection and client.id=123;

Конечно, возможно создать отношение «многие ко многим», но я не буду создавать дополнительную таблицу для него иизменить структуру таблиц.

class Addres(models.Model):       
    address = models.CharField(max_length=150)
    city    = models.ForeignKey(City)




class Client(models.Model):
    addres          =models.ManyToMany(Addres)        
    email           =models.EmailField(blank=True)
    name            =models.CharField(max_length=50)

Возможно добавить ForeignKey (Клиент) в модель Адреса, но мне также нужна ссылка на Адреса из других моделей, таких как Пользователь, Работодатель ...создавать модели с отношениями из вышеуказанных таблиц.

Ответы [ 2 ]

3 голосов
/ 06 марта 2011

Это может быть полезно - Один ко многим .Это официальная документация, поэтому ничего особенного ...

Я не уверен, правильно ли я понял вопрос, но что если вы определите поле сбора как внешний ключ для Клиента?Тогда вы должны быть в состоянии сделать что-то вроде

address = Address.objects.get(collection=123)
2 голосов
/ 06 марта 2011

Я думаю, вам нужно использовать структуру типов контента для создания универсального внешнего ключа в модели Addres.

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

class Addres(models.Model):
    content_type = models.ForeignKey(ContentType, related_name='addresses')
    object_id = models.IntegerField()
    content_object = generic.GenericForeignKey( )

    address = models.CharField()
    city = models.ForeignKey(City)

class Client(models.Model):
    addresses = generic.GenericRelation( Addres )
    email = models.EmailField()
    name = models.CharField()

тогда клиентские объекты будут возвращать адреса с помощью client.addresses, или вы можете запросить модель адресов следующим образом:

client = Client.objects.get(pk=123)
addresses = Addres.objects.filter(content_object=client)

и модель Адреса можно связать и с другими моделями, например,

class User(models.Model):
     addresses = generic.GenericRelation( Addres )
     name = models.CharField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...