2016-07-06 3 views
0

Мне нужно поставить два внешних ключа в модельный класс из двух разных моделей. Я хотел бы связать третий класс модели с первым и вторым.Два внешних ключа в одной модели от двух разных моделей

Я пытался что-то вроде этого:

class A (models.Model) 
    id_A = models.IntergerField (primary_key=True) 
    #... 

    class B (models.Model) 
    id_B = models.IntergerField (primary_key=True) 
    #... 

    class C (models.Model) 
     id_A = models.ForeignKey(A) 
     id_B = models.ForeignKey(B) 

Читая документы я понимаю, что это не возможно, чтобы иметь MultipleColumnPrimaryKeys ... но я не получал никакой ошибки от Джанго с этим models.py

Возможно ли это? Есть ли более разумный способ?

Спасибо!

ответ

1

Вы делаете это хорошо, если вы связываете id_A и id_B с одной и той же моделью, django даст вам ошибку, в этом случае просто поместите атрибут related_name во второе поле.

+0

Хорошо, я собирался найти ответ об атрибуте related_name, но вы уже ответили мне !! Спасибо! – Hari

0

Django не удалось зарегистрировать ошибку, потому что вы делали это правильно. Совершенно разумно, что в одной модели есть несколько внешних ключей, как класс C.

В классе C, если id_A и id_B - это первичные ключи одного столбца собственной модели, он отлично справится.

«MultipleColumnPrimaryKeys», о котором вы упомянули, это другое дело. Это означает, что для конкретной таблицы в базе данных несколько столбцов являются основным ключом таблицы, который не поддерживается в Django.

+0

Большое спасибо! Я новичок, и сейчас я все пытаюсь! До свидания! – Hari

1

Вы можете использовать многие-ко-многим, который автоматически создает что промежуточная модель для вас:

from django.db import models 


class Publication(models.Model): 
    title = models.CharField(max_length=30) 


class Article(models.Model): 
    headline = models.CharField(max_length=100) 
    publications = models.ManyToManyField(Publication, related_name='articles') 

При этом вы можете сделать так:

publication.articles.all() # Gives you the articles of the current publication instance 
article.publications.all() # Gives you the publications of the current article instance 

Отъезд документы для many to many

Если вам нужно использовать любые дополнительные поля в этой промежуточной модели, вы можете указать django, которая является моделью through следующим образом:

from django.db import models 


class Person(models.Model): 
    name = models.CharField(max_length=128) 


class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 


class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

Заканчивать Документы для extra fields on many to many

Кроме того, если вы собираетесь на стандартное число автоинкрементного первичного ключа, Джанго уже генерирует один для вас, так что вам не нужно определить id_A и id_B.

+0

Благодарим вас за ответ. На самом деле, id_A и id_B не являются первичным ключом автоматического увеличения, но UUIDField: теперь я понимаю, что я не писал правильно. – Hari

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