停止影响Django多对多模型的其他对象

2024-09-28 03:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图复制血型作为这张图片中定义的模型。 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, obj):
        return ", ".join([item.name for item in obj.receives.all()])

admin.site.register(BloodGroup, BloodGroupAdmin)

最初,我只提供它们的名称,创建了没有“给予”和“接受”属性的纯血族对象。因此,我为所有8种类型创建了一个对象。然后,当我向每个对象添加关系时,我发现为一个对象添加给予或接受也会影响其他对象的给予和接受,从而无法复制图像中的结构

enter image description here

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

Tags: 对象nameselfobjgetreturn定义admin
1条回答
网友
1楼 · 发布于 2024-09-28 03:19:21

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

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

然后只需要将对象添加到givesreceives将自动生成

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

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

相关问题 更多 >

    热门问题