在我的模型中,我有一个 Concert类和一个Venue类(class)。每个 field 都有多场音乐会。我一直在用一个简单的
venue = models.IntegerField(max_length = 10)
...包含场所对象的主键。一位同事建议我们使用 venue = models.ForeignKey(Venue)反而。虽然这也有效,但我想知道是否值得切换,因为我已经能够通过简单地使用 Concert.objects.filter(venue=4) 中的 field ID 解析出 field 的所有音乐会。就像我用 ForeignKey 做的一样: Venue_instance.Concert_set.all() .我在使用我的方法时从未遇到过任何问题。
我的看法是,使用 IntegerField和 objects.filter()与 ForeignKey 一样是“ManyToOne”关系,所以我想知道我哪里错了。为什么是ForeignKeys有利?他们更快吗?是不是更好的数据库设计?更简洁的代码?
请您参考如下方法:
我想说外键最实际的好处是能够自动查询跨关系。 Django 自动生成 JOIN。
正如您提到的,自动反向关系助手也很棒。
下面是一些只有整数关系会更复杂的例子。
concerts = Concert.objects.filter(...)
concerts.order_by('venue__attribute') # ordering beyond PK.
concerts.filter(venue__name='foo') # filter by a value across the relationship
concerts.values_list('venue__name') # get just venue names
concerts.values('venue__city').annotate() # get unique values across the venue
concerts.filter(venue__more__relationships='foo')
Venue.objects.filter(concert__name='Coachella') # reverse lookups work too
# with an integer field for Concert.venue, you'd have to do something like...
Venue.objects.filter(id__in=Concert.objects.filter(name='Coachella'))
正如其他人所指出的...数据库完整性很有用,级联删除(当然是可定制的)和 facepalm 我刚刚想到 django admin 和表单框架与外键配合得非常好.
class ConcertInline(admin.TabularInline):
model = Concert
class VenueAdmin(admin.ModelAdmin):
inlines = [ConcertInline]
# that was quick!
我相信还有更多 Django 功能处理外键的示例。
