2017-09-17 11 views
0

私はmodels.pyで、次のテーブルを持っている:これは正常に動作している一意でないIDを持つテーブルを作成し、それを別のテーブルの外部キーとするにはどうすればいいですか?

class Part(models.Model): 
    partno = models.CharField(max_length=50, unique=True) 
    partdesc = models.CharField(max_length=50, default=None, blank=True, null=True) 

class Price(models.Model): 
    part = models.ForeignKey(Part, on_delete=models.CASCADE, null=True) 
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE) 
    qty = models.IntegerField(default=1) 
    price = models.DecimalField(max_digits=9, decimal_places=2) 
    currency = models.ForeignKey(Currency, on_delete=models.CASCADE) 
    datestart = models.DateTimeField(auto_now_add=True, blank=False, null=False) 

    class Meta: 
     unique_together = (('supplier', 'part'),) 

。問題は、私はそれらの交換品である多くの部品番号があることです。たとえば、部品1001-01,1001-02,1001-03はすべて同じ部品です。それでも、私はPartテーブルにそれらのすべてを持っています。

私はそれらを別のテーブルで照合する必要があるため、それぞれ別々に価格を入力する必要はありません。これらの3つの項目すべてを表す一意のキーが必要です。

質問:「パーツ番号一致テーブル」をセットアップし、このテーブルの外部キーを価格テーブルに設定するにはどうすればよいですか?

(休憩はこれまでのところ、私の意見/問題である読むことが任意である、しかし役立つかもしれない)

1:私はセットアップには、このようなテーブルを試してみました:

class PartMatch(models.Model): 
    id = models.IntegerField(primary_key=True, unique=False, null=False, db_index=True) 
    part = models.ForeignKey(Part, unique=False, on_delete=models.CASCADE) 

移行中にエラーは発生しませんが、同じIDをPKに使用しようとすると、許可されません。

2:私は一人でPKを左にして部品を一致させるために、セットアップに別のフィールドを試してみました:

class PartMatch(models.Model): 
    part = models.ForeignKey(Part, on_delete=models.CASCADE) 
    partmatchid = models.IntegerField(null=True, unique=False, db_index=True) 

移行中に、私はすべてのエラーを得ることはありませんが、私は外部キーとしてpartmatchidを使用しようとすると、このような私のPrice表に:

partmatch = models.ForeignKey(PartMatch, to_field="partmatchid", 
            db_column="partmatchid", 
            on_delete=models.CASCADE) 

私は、移行中foreign key must be uniqueを言って、エラーを取得します。

この場合、私は解決策がありません。私はあなたがこれをどう扱うのだろうか?

答えて

1

Partモデルの外部キーは、PartMatchにすることができます。それ以外の方法ではありません。

あなたのモデルは、例えばPart *<-->1 PartMatchPartMatch 1<-->1 Price

ことができます。

class Price(models.Model): 
    price = models.DecimalField(max_digits=9, decimal_places=2) 


class PartMatch(models.Model): 
    price = models.OneToOneField(Price, primary_key=True) 


class Part(models.Model): 
    partno = models.CharField(max_length=50, unique=True) 
    partMatch = models.ForeignKey(PartMatch) 

あなたには、いくつかの価格ですべての部分を取得したい場合は、some_price.partmatch.part_set.all()は仕事を行います。

+0

それを試してみましょう。ありがとう –

+0

私はあなたが提案したことをしましたが、PartMatchテーブルからは1つのパーツだけの価格を表示できます。 Part.Partmatchid = Partmatch.id'の3つの部品番号の価格をすべて表示するにはどうすればいいですか? –

+0

私は「価格 - >パート - パートマッチ」のパスをたどって、私が望むことをする方法を見つけることができなかったので、各パートの価格を個別に入力することを選択しました。それが私を助けたので私はあなたの答えを受け入れる。ありがとう。 –

関連する問題