Skip to main content
 首页 » 编程设计

python之为什么 models.ForeignKey 有优势

2025年05月04日17pengyingh

在我的模型中,我有一个 Concert类和一个Venue类(class)。每个 field 都有多场音乐会。我一直在用一个简单的

将 Concert 类链接到 Venue

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 功能处理外键的示例。