私が Django で開発しているモデルには、やや複雑な状況があります。基本的な考え方は、サイトのユーザーが人に賞を与えることができるというものですが、ユーザーと受賞者の関係も追跡したいと考えています。ユーザーは同じ人に複数の賞を与えることができますが、それらの間には 1 つの関係しかありません。モデルは次のようになります (ユーザーは標準の auth_user モデルです)。
class Recipient(models.Model):
name = models.CharField(max_length=255)
senders = models.ManyToManyField(User, through='Relationship')
class Relationship(models.Model):
user = models.ForeignKey(User)
recipient = models.ForeignKey(Recipient)
relationship = models.CharField(max_length=255, blank=True, default='')
class Meta:
unique_together = (('user', 'recipient'),)
class Award(models.Model):
recipient = models.ForeignKey(Recipient)
user = models.ForeignKey(User)
relationship = models.ForeignKey(Relationship)
award_name = models.CharField(max_length=255)
管理者には次のようなものがあります
class RelationshipInline(admin.StackedInline):
model = Relationship
class AwardAdmin(admin.ModelAdmin):
inlines = [RelationshipInline]
exclude = ['relationship']
admin.site.register(Recipient)
admin.site.register(Award, AwardAdmin)
管理画面でアワードを追加しようとすると、「<class 'Relationship'> には <class 'Award'> への ForeignKey がありません」というエラーが表示されます。これは、Award を編集するときに、Django がどの関係をインラインで編集する必要があるかを認識していないためだと認識していますが、実際には (人間にとって) 同じユーザー/受信者のペアを持つものであることは明らかです。Django は複数列のキーをサポートしていないため、Relationship のユーザー/受信者がキーであることを指定できません (そのため、できることはそれらを unique_together として指定することだけです)。同様に、Award のユーザー/受信者が Relationship への複数列の外部キーであることを指定することはできません。
ここで取得しようとしているものを取得する方法はありますか? Award から多対 1 の関係がある場合、管理者で関係を個別に編集しなければならないのは非常に不便です。モデルを整理するためのより良い方法はありますか?