Django关系

Con*_*eri 6 django django-models django-admin

我是Django的新手,并且有很多问题让我想到许多关系和Manytoone(即外键).

我的设置是这样的.

我有A级,B级,C级

每个B类对象必须属于A类对象.它们不能属于多个A类对象.一个更实际的例子可能是,如果A类是音乐乐队,而B类是带有该乐队的歌曲.大多数乐队将有多首歌曲,但每首歌曲必须属于一个乐队(在这个例子中,一首歌曲永远不会有多个乐队).

C类是各个乐队成员的列表.因此,每个乐队成员都可以与任意数量的歌曲以及任意数量的乐队相关联.换句话说,乐队X的成员也可以是乐队Y的成员.

那我的问题就是

我将如何在此上下文中使用ForeignKey和ManytoMany关系?

这个例子只是为了让我的情况更容易理解并帮助我解释我的问题.我希望管理员为每个C类对象显示C类所属的B类对象或A类对象.B类和A类也是如此.

如果查看A类对象,您应该能够查找属于该特定A类对象的所有B类对象的列表.

任何和所有输入赞赏.

Mat*_*sen 11

这是我如何设置它(在你的models.py)

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

   def __unicode__(self):
       return self.name


class Band(models.Model):
   name = models.CharField(max_length=100)
   members = models.ManyToManyField(Member)
   ... 

   def __unicode__(self):
       return self.name


class Song(models.Model):
   name = models.CharField(max_length=100)
   band = models.ForeignKey(Band)
   ...

   def __unicode__(self):
       return self.name
Run Code Online (Sandbox Code Playgroud)

设置如下:

  • member.band_set.all() 为您提供成员所属的所有乐队
  • band.members.all() 给你一个乐队的成员
  • song.band 给你那首歌的乐队
  • band.song_set.all() 为你提供乐队的所有歌曲

请注意,band_seton成员和song_seton band是"反向"关系.它们没有在模型中明确定义,但Django透明地为您设置它们.您可以使用related_name字段定义上的参数自定义它们.例:

class Band(models.Model):
   members = models.ManyToManyField(Member,related_name='bands')
Run Code Online (Sandbox Code Playgroud)

会让你获得会员的所有乐队如下:

member.bands.all()
Run Code Online (Sandbox Code Playgroud)

管理员将自动提供以下内容:

  • 在多选列表中显示乐队的所有成员
  • 在单个选择列表中显示歌曲的乐队

但是,如果你想看一个乐队的歌曲,你将不得不做一些管理员定制.

在你的admin.py:

from django.contrib import admin

class SongInline(admin.StackedInline):
    model = Song
    extra = 1

class BandAdmin(admin.ModelAdmin):
    inlines = [SongInline]

admin.site.register(Band,BandAdmin)
admin.site.register(Member)
admin.site.register(Song)
Run Code Online (Sandbox Code Playgroud)

这将让您直接从管理页面查看歌曲 - 并编辑或添加它们!通过遵循此模板,您还可以显示成员的所有乐队.

您可以在http://docs.djangoproject.com/en/dev/intro/tutorial02/上获得有关管理员自定义的更详细介绍.


Dan*_*man 3

这一切都相当简单。我使用了下面的描述性名称,以便更容易理解。

class Band(models.Model):
    name = models.CharField(max_length=255)

class BandMember(models.Model):
    name = models.CharField(max_length=255)
    bands = models.ManyToManyField(Band)

class Song(models.Model):
    name = models.CharField(max_length=255)
    band = models.ForeignKey(Band)

# get a band
myband = Band.objects.get(name='myband')

# all songs from that band
print myband.song_set.all()

# all members of that band
print myband.bandmembers.all()


# get a specific band member
dave = BandMember.objects.get(name='Dave')

# what bands is Dave a member of?
print dave.bands.all()

# what songs has Dave sung? (slightly more complicated)
print Song.objects.get(band__bandmember=dave)
Run Code Online (Sandbox Code Playgroud)