Как создать отношение «многие к одному» с django и отобразить его в интерфейсе администратора - PullRequest
1 голос
/ 17 декабря 2011

У меня есть следующая проблема - я хотел бы создать отображение много-к-одному в 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()

, которые должны быть представленына странице редактирования сайта (родительского объекта).Хотя это звучит как тривиальная проблема, я не смог найти ничего полезного в этом

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Добавьте параметр related_name в ForeignKey на WebsiteIP, например, так:

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-адреса как сопоставления «многие к одному» с веб-сайта, например:

website = Website.objects.filter(name="blah")
if website.count():
  IPs = website[0].IPs

Не проверено, конечно, но это должно привести вас в правильном направлении.Также проверьте: https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-one-relationships

В вашем admin.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', )

Должен отображать то, что вы хотите!

0 голосов
/ 20 декабря 2011

Обойти эту проблему можно, изменив настройки первичного ключа в зависимом отношении (но это работает только в случаях, подобных этому - когда есть один фрагмент ключа, который может быть уникальным для всей таблицы (в данном случае ip)).

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

После этого (и только после этого) часть решения, предложенного mkoistinen, будет работать ожидаемым образом.Общая проблема заключается в том, что django проверяет способность создавать новые объекты, проверяя уникальность столбцов первичного ключа (неправильно), поэтому я думаю, что это можно исправить, переопределив некоторые из моделей models.Model, но я этого не делаюдостаточно знать о внутренностях django, чтобы указывать, какой метод.

...