2016-03-23 29 views
1

Djangoによって作成されたgroup_coverテーブルをチェックすると、group_id_idフィールドとgroup_coverフィールドがあります。 group_id_idgroup_idに変更したいと思います。Django OneToOneFieldとForeignKeyFieldは、フィールドに "_id"接尾辞を追加します

models.py

class Group(models.Model): 

    group_id = models.AutoField(primary_key=True) 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 


class Group_Cover(models.Model): 

    group_id = models.OneToOneField(Group, primary_key=True) # this create group_id_id 
    group_cover = models.ImageField(upload_to="/image/group/") 


class Group_Member(models.Model): 

    user_id = models.ForeignKey(User2) # this create user_id_id 
    group_id = models.ForeignKey(Group) # this create group_id_id 

ええ、私が書く場合、

group = models.OneToOneField(Group, primary_key=True) 

それがうまくいくかもしれないが、私はいくつかのフィールド上の "_id" サフィックスを必要としない場合があります。

私はthis documentと読んでいますが、英語の貧弱さのために、私はその方法を理解できませんでした。 変更方法を教えていただけますか?

答えて

4

Djangoは自動的に生成される主キーに_idポストを追加します。レガシーデータベースを使用しない限り、一般的に心配する必要はありません。

解決策2は、私が新しいプロジェクトにお勧めするものです。レガシーデータベースのソリューション1

ソリューション1

それはデータベース内のフィールドに名前を付けることができますよう、次のフィールドのdb_column属性を使用し、既存のコードを変更するには:

group = models.AutoField(primary_key=True, db_column='group_id') 

Documentation

ソリューション2

g DjangoがPrimaryキーを自動的に生成して、次に示すようにOneToOneフィールドとForeign keyフィールドのモデルを参照させるように、より「Django」の方法で同じ結果を返します。

class Group(models.Model): 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 

class Group_Cover(models.Model): 
    group = models.OneToOneField(Group) 
    group_cover = models.ImageField(upload_to="/image/group/") 

class Group_Member(models.Model): 
    user = models.ForeignKey(User2) 
    group = models.ForeignKey(Group) 
+0

ありがとう、リー。私は私のデータベース設計を少し改めなければならないと思う。ソリューション2は私のコードにとって簡単です。どうもありがとうございました。 – yamachan

+0

全く問題ありません:) – Lee

+0

クラス名は、Pythonの命名規則に従ってください(例えば、 'Group_Mover'の代わりに' GroupCover'と 'GroupMember'の代わりに' GroupCover') – ray

3

あなたの前提は正しいです。_id(すなわち、group_idの代わりにgroup)を含まないようにフィールドの名前を変更する必要があります。これはあなたの "問題"を修正しますが、何よりも正確に関係/分野を表します。 idとの関係ではなく、モデルとの関係があります。

_idは、_idをモデルから取得するのが簡単になるようにdjangoが提供する自動参照です。

舞台裏documentation

から、Djangoはそのデータベースのカラム名を作成するには、フィールド名に「_id」を追加します。上記の例では、Carモデルのデータベーステーブルにmanufacturer_id列があります。 (これはdb_columnを指定することで明示的に変更できます)ただし、カスタムSQLを記述しない限り、コードでデータベースの列名を処理する必要はありません。モデルオブジェクトのフィールド名は常に扱います。

+1

あなたの答えよりも。わかりました。尾...私はソニックとテールが好きでした。 – yamachan

+1

@yamachan - 心配はいりません!尾はいつも最もクールなものでした! :) – Sayse

+1

私は一度でも目標に到達することはできませんでしたが、私はゲーム、ソニックザヘッジホッグが好きでした...笑 – yamachan

2

データベーステーブルに追加されている_idを心配する必要はありません。 DjangoでORMを使用している場合、データベースを扱うべきではありません。また、属性の特別なタイプのグループでない限り、idを指定する必要はありません。
私は(私はあなたがその多くのクラスを必要としないと考えている)、このようにそれを行うだろう:

class Group(models.Model): 
    name = models.CharField(max_length=50, unique=False, blank=False) 
    cover = models.ImageField(upload_to="/image/group/") 
    users = models.ManyToManyField(User2) 

は、その後、あなたがオブジェクト表記で属性にアクセスする必要があります。 idを使用する場合は、group.idを使用してください。オブジェクトをフィルタリングする場合は、Group.objects.filter(id__gt=10)またはGroup.objects.get(id=1)などを使用してください。私のモデルは、達成したいことを正確に実行する必要があります。

+0

ありがとう、Lucas03。ああ、本当に?あなたのコードははるかにcleverer、特にユーザーフィールドに見えます。あなたのヒントをありがとう。 – yamachan

関連する問題