Django中创建多对一关系子对象时关联父对象的方法
解决Django一对多关系中子模型创建时关联父模型的问题
核心思路
通过URL传递父模型Site的ID参数,在创建子模型Administrator的视图中获取该ID并查询对应Site实例,最终关联到新创建的Administrator对象上。
步骤1:配置包含父模型ID的URL
确保路由中包含Site的ID参数,让创建Administrator的视图能获取到父对象的标识:
# urls.py from django.urls import path from .views import AdministratorCreateView urlpatterns = [ # 其他URL配置... path('sites/<int:site_id>/administrators/add/', AdministratorCreateView.as_view(), name='administrator_add'), ]
步骤2:在视图中关联父模型
在创建Administrator的类视图中,从URL参数里提取site_id,查询对应的Site实例并关联到子对象:
# views.py from django.views.generic.edit import CreateView from .models import Administrator, Site class AdministratorCreateView(CreateView): model = Administrator fields = ['first_name', 'last_name', 'telephone', 'email'] def form_valid(self, form): # 从URL参数获取site_id,查询对应Site对象 site_id = self.kwargs.get('site_id') # 可选:加上用户过滤,确保只能操作当前用户的Site site = Site.objects.get(pk=site_id, user=self.request.user) # 关联父模型并保存 self.object = form.save(commit=False) self.object.site = site self.object.save() return super().form_valid(form)
额外修正:Site模型的方法问题
你的Site模型中get_queryset方法定义存在错误,建议改为类方法以正确获取用户的站点集合:
class Site(models.Model): # ... 原有字段定义 @classmethod def get_user_sites(cls, user): return cls.objects.filter(user=user)
内容的提问来源于stack exchange,提问作者Cromwell1963
相关产品推荐
相关产品推荐

