簡體   English   中英

基於Django中另一個字段的唯一值字段

[英]unique value field based on another field in django

前言:我是django和db設計的新手。

SUPEREDIT:我進行了一些重大更改,因此更改之前的答案可能引用了此處未提及的內容。 我道歉。

我將直接使用以下代碼:models.py:

class Player(models.Model):
    name = models.CharField()

class Team(models.Model):
    name = models.CharField()
    members = models.ManyToManyField(Player, through='Membership')

class Word(models.Model):
    word = models.CharField(unique=True)
    definition = models.CharField()
    ...

class Ownership(models.Model):
    owner = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    word = models.ForeignKey(Word)

class Membership(models.Model):
    team = models.ForeignKey(Team)
    player = models.ForeignKey(Player)

Word表已被填充。 在管理員中,我創建一個播放器。 然后,我創建一個團隊並向其中添加成員。 我已將所有權添加到管理員。 我創建了新的所有權,然后從球員,球隊和詞匯中進行選擇。 我想施加一個約束,即如果一個球員擁有給定團隊的一個詞,那么屬於該團隊的球員就不能擁有該團隊中的這個詞。 他們可能在其他團隊中擁有這個詞。

現在的樣子。 我可以在同一支球隊中讓兩個不同的球員擁有相同的詞。 壞。 基本上,我希望管理員說出該團隊中所有的單詞,而不要在下拉列表中使用。

如何建立這種關系的模型? 如何在管理員中獲得此功能?

編輯:我添加了成員​​資格模型只是為了表明我正在嘗試解決一個不同的問題。 正如我所說的,這是我實際工作的簡化示例。 如您所見,我已經完成了成員關系,我正在嘗試解決另一個所有權問題。

您的架構不正確。 您應該使用“多對多關系上的額外字段”, 如Django文檔所示

在SO上也突出顯示了它。

查看您的“團隊編號”關聯的unique_together 我不確定它是否也可以與多對多方法中的其他字段結合使用。 否則,您可以在視圖中強制執行唯一性,但是我相信unique_together應該可以在您的情況下工作。

對於1-99限制,您應該只在表單驗證中包含此限制,並且與唯一性檢查結合使用,就不需要整個表來存儲數字1-99。

更新您的編輯

我不確定您是否實際閱讀了我的帖子或關注了我的任何鏈接,但這完全可以解決您所描述的問題,除非您當然還沒有正確解釋問題。 數字的“所有權”不是您應該建模的東西,您應該在數字所屬的地方表達它:

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

    def __unicode__(self):
        return self.name

class Team(models.Model):
    name = models.CharField(max_length=128)
    players = models.ManyToManyField(Player, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    player = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    number = models.IntegerField()
    """ ... """

    class Meta:
        unique_together = ('team', 'number')

因此,請再次向我解釋,您需要如何為玩家-球隊-號碼關聯建立所有權模型,因為我不確定您要實現的目標與我已經提供給您的是分開的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM