2011-06-21 25 views
0

こんにちは私のシステムには、さまざまなタイプに分類されているユーザーがたくさんいます。私はすべてのそれらのユーザーのアドレスの詳細を保存したい。例えば、ユーザは、学生、学校またはフランチャイジーとすることができる。ここにいるすべてのユーザーは、それらに関連付けられたアドレス情報を持つことができます。このシナリオではDjangoの別のモデルで同じモデルを複数参照する

from django.db import models 
from django.contrib.auth.Models import User 

class Address(models.Model): 
    user = models.OneToOneField(User) 
    address = models.TextField() 

class Student(models.Model): 
    user_id = models.ForeignKey(User) 
    address = models.ForeignKey(Address) 

class School(models.Model): 
    user_id = models.ForeignKey(User) 
    address = models.ForeignKey(Address) 
    contact_person_name = models.CharField(max_length=50) 

ユーザモデルに2つの参照がある - それらは同じインスタンスを参照されたいUSER_IDわたり1及びaddress.user介して別の。重複する参照を持つことは悪い習慣ですか?

私はAddressに 'user'という外部キーを残すことを考えましたが、そのアドレスはユーザーなしでは存在できないと思います。これをより良くモデル化するには?

答えて

1

の同じ分野の重複についてはすでに述べましたが、モデルは良いアイデアではありません。

これらは、あなたの実際のモデルであれば、私はabstract modelsを使用して、あなたをお勧めします:

from django.db import models 
from django.contrib.auth.Models import User 

class Profile(models.Model): 
    user = models.OneToOneField(User, related_name="%(app_label)s_%(class)s_related") 
    address = models.TextField() 

    class Meta: 
     abstract = True 

class Student(Profile): 
    pass 

class School(Profile): 
    contact_person_name = models.CharField(max_length=50) 

これは、2つのテーブルが生成されます。それぞれの学生、フィールド ユーザー、アドレスとユーザーとの学校、住所、contact_person_name を。

+0

こんにちは@crodjer、ユーザーの経費を保存して分類する全く異なるシナリオで、説明したのと同じ概念をどのように使用できますか?各経費記録はユーザーに関連付けられます。各費用について、ユーザは自分が作成したカテゴリの1つを関連づけなければならない。だから私は 'カテゴリ(ユーザ、名前)'と '費用(ユーザ、金額、カテゴリ)'のようなものを持っています。しかし、ユーザ参照はここで複製されます。共有がないので抽象クラスを使うことはできないと思います。 – Guruprasad

+0

学校の住所と生徒の住所は類似した情報なので、上記の例のように抽象クラスで2つではなく1つのテーブルに格納すべきですか? – Guruprasad

関連する問題