不再影响Django多对多模型的其他对象

问题描述

我正尝试将这张图片中定义的“血型”复制为模型。

blood group relations

在我的models.py文件中,我有代码来复制这样的血型

class BloodGroup(models.Model):
    name = models.CharField(
        max_length=3
    )
    gives = models.ManyToManyField("self")
    receives = models.ManyToManyField("self")

    def __str__(self):
        return self.name

在我的admin.py文件中,我已经按照以下方式注册了模型

class BloodGroupAdmin(admin.ModelAdmin):
    model = BloodGroup
    list_display = ['name','get_gives','get_receives']

    def get_gives(self,obj):
        return ",".join([item.name for item in obj.gives.all()])

    def get_receives(self,".join([item.name for item in obj.receives.all()])

admin.site.register(BloodGroup,BloodGroupAdmin)

最初,我仅通过仅提供它们的名称来创建普通的BloodGroup对象,而没有它们的Give和Receive属性。因此,我为所有8种类型创建了一个对象。然后,当我向每个对象添加关系时,我发现为一个对象添加给定或接收也会影响其他对象的给定和接收,从而无法在图像中复制结构。

enter image description here

  1. 如何定义关系而不影响其他对象?
  2. 在我的管理站点中,我看到字段名称为“ get_gives”和“ get_receives”。我如何使管理页面将字段名称显示为“给定”和“接收”,但仍将对象显示为字符串,如下图所示?

解决方法

对于第一个问题,最好只有一个关系gives。可以从the reverse query中找到receives。像这样:

class BloodGroup(models.Model):
    name = models.CharField(
        max_length=3
    )
    gives = models.ManyToManyField("self",related_name="receives",symmetrical=False)

然后,您只需要向gives添加对象。 receives将自动生成。

第二个问题,将short_description属性添加到函数(reference to docs)。像这样:

get_gives.short_description = 'Gives'
get_receives.short_description = 'Receives'