Django管理中的raw_id_fields和多对多

yhuiod9q  于 2023-01-31  发布在  Go
关注(0)|答案(2)|浏览(156)

我想在admin中对ManyToMany关系使用raw_id_fields,并且希望每个相关对象都显示在自己的行中(而不是在单个字段中显示逗号分隔的列表,这是默认行为)。

# models.py
class Profile(models.Model):
    ...
    follows = models.ManyToManyField(User,related_name='followees')

# admin.py
class FollowersInline(admin.TabularInline):
    model = Profile
    raw_id_fields = ('follows',)
    extra = 1

class ProfileAdmin(admin.ModelAdmin):
    search_fields = ('user__first_name','user__last_name','user__username',)
    inlines = (FollowersInline,)

admin.site.register(Profile,ProfileAdmin)

但这会产生错误:

<class 'bucket.models.Profile'> has no ForeignKey to <class 'bucket.models.Profile'>

我不清楚我做错了什么。谢谢你的建议。

c9qzyr3d

c9qzyr3d1#

看起来你为你的InlineAdmin设置了错误的模型,因为你为追随者定义的模型是User而不是Profile
看了这些文件,我觉得你应该试试:

class FollowersInline(admin.TabularInline):
    model = Profile.follows.through

以及

class ProfileAdmin(admin.ModelAdmin):
    ....
    exclude = ('follows',)
    inlines = (FollowersInline,)
jexiocij

jexiocij2#

在m2m连接的内联中,您应该使用through表,而对于raw_id_fields设置,您应该使用through表中的字段-在此表中,字段的名称可能与您预期的不同。
您需要转到sqlite3/psql等终端以查看through表架构并使用raw_id_fields的proper字段。

class FollowersInline(admin.TabularInline):
    model = Profile.follows.through
    # raw_id_fields = ("follows",) <- wrong
    raw_id_fields = ("user",) # <- probably right, because your m2m relation with `User` table and django use name of that table to name field in `through` model

相关问题