如何在django中建立多对一关系,并在后台显示

2024-06-07 20:59:51 发布

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

我有以下问题-我想在django中创建多对一映射,以表示对象和对象片段之间的基本关系,例如:

class Website(models.Model):
    name = models.CharField(max_length = 100)

class WebsiteIp(models.Model):
    website = models.ForeignKey(Website, primary_key = True)
    ip = models.CharField(max_length = 40, primary_key = True)
    introduction_date = models.DateField()

这些都应该呈现在网站(父对象)编辑页面上。虽然这听起来是个小问题,但我在这方面找不到任何有用的东西


Tags: 对象djangokeynametruemodel关系models
2条回答

解决这个问题的方法是修改依赖关系的主键设置(但这只适用于这样的情况——当有一个键对整个表来说可能是唯一的(在本例中是ip))。在

class WebsiteIp(models.Model):
    website = models.ForeignKey(Website)
    ip = models.CharField(max_length = 40, primary_key = True)
    introduction_date = models.DateField()

在这之后(而且仅在此之后),mkoistinen提出的部分解决方案将以预期的方式工作。一般的问题是django通过检查主键列的唯一性来检查创建新对象的能力(以错误的方式),所以我想通过重写一些模型。模型方法,但我对django内部结构了解不够,无法指出什么方法。在

将相关的_name参数添加到WebsiteIP上的ForeignKey,如下所示:

class Website(models.Model):
    name = models.CharField(max_length = 100)

class WebsiteIp(models.Model):
    website = models.ForeignKey(Website, primary_key = True, related_name="IPs")
    ip = models.CharField(max_length = 40)
    introduction_date = models.DateField()

然后,您可以将IP作为多对一映射从网站引用,如下所示:

^{pr2}$

当然没有经过测试,但这会让你找到正确的方向。另请查看:https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-one-relationships

在你的管理员py,你大概有这样的东西:

class WebsiteAdmin(admin.ModelAdmin):
  list_display = ('name',)
  search_fields = ['name']
  ordering = ('name', )

更新到以下内容:

class WebsiteIpInline(admin.TabularInline):
  model = WebsiteIp
  extra = 1

class WebsiteAdmin(admin.ModelAdmin):
  list_display = ('name',)
  search_fields = ['name']
  inlines = ( WebsiteIpInline, )
  ordering = ('name', )

应该显示你想要的!在

相关问题 更多 >

    热门问题