反向找related_name以及limit_fields_to

时间:2021-02-10 19:14:16

问题2:客户的添加页面,通过popup创建用户时
解决方案:
  如果新创建的用户时:如果是销售部的人,页面才增加
  目的是:拿到limit_choices_to,就可以判断了

当有两个Foreignkey的时候,都关联同一张表,反向生成的时候
不知道去找那个字段了,得加上releated_name

1、创建表

from django.db import models

# Create your models here.
class UserInfo(models.Model):
user_type_choices
= (
(
1,"班主任"),
(
2,"讲师")
)
user_type_id
= models.IntegerField(choices=user_type_choices)
name
= models.CharField(max_length=32,verbose_name="姓名")
pwd
= models.CharField(max_length=32,verbose_name="密码")

class ClassList(models.Model):
teacher
= models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":1},related_name="toclasslist") ## user_obj.tclasslist.all()
classteacher = models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":2}) #没有related_name默认是None #user_obj.classlist_set.all()

class Test(models.Model):
title
= models.CharField(max_length=32)
teacher
= models.ForeignKey(to="UserInfo",to_field="id",limit_choices_to={"user_type_id":3}) #注意limit_choices_to的key必须要和上面的对应上

2、urls

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns
= [
url(r
'^admin/', admin.site.urls),
url(r
'^test/',views.test),
url(r
'^index/',views.index),
url(r
'^condition/',views.condition),
]

3、views

from django.db.models import Q
from django.shortcuts import render,HttpResponse
from django.forms import ModelForm
from app01 import models
# Create your views here.
class UserInfoForm(ModelForm):
class Meta:
model
= models.UserInfo
fields
= "__all__"


class ClassListForm(ModelForm):
class Meta:
model
= models.ClassList
fields
= "__all__"

def condition(request):
'''测试Q查询'''

key_word
= request.GET.get("q")
# print(key_word)
search_fileds = ['name', 'email'] # 拿到搜索字段
condition = Q()
condition.connector
= "or"
if key_word and True:
for fields_name in search_fileds:
condition.children.append((fields_name, key_word))
print(condition)
return HttpResponse("ok")


def test(request):
mn
= request.GET.get("model_name")
rn
= request.GET.get("related_name")
from django.db.models.fields.reverse_related import ManyToOneRel
# 1、创建用户(自己创建的用户和利用ModelForm,form.save()创建的一样))
# form = UserInfoForm(request.POST)
# obj = form.save()
obj = models.UserInfo.objects.create(user_type_id=1,name="hiana",pwd=123456)
# 2、判断用户的类型是否可以放置到班主任的下拉框
#获取obj对象可反向关联的所有的字段
#关联字段所在类的名称等
# print(obj._meta.related_objects) #(<ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.test>)
for related_object in obj._meta.related_objects:
# print(related_object.related_name) #打印的是反向查询的related_name,结果是:toclasslist,None,None
# print(related_object.field,"1") #app01.ClassList.teacher 关联的那个字段的名字
# print(related_object.field.model,"2") #<class 'app01.models.ClassList'> 关联的字段所在的类
# print(related_object.field.model._meta.model_name,"3") #classlist 关联字段所在的类名
model_name = related_object.field.model._meta.model_name
related_name
=related_object.related_name
if type(related_object) ==ManyToOneRel:
to_field_value
= related_object.field_name #那到的是反向查询关联字段(to_fields)的值 id
limit_choices_to = related_object.limit_choices_to #拿到的是limit_choices_to的值{'user_type_id': 2}
if model_name==mn and str(related_name)==rn:
print(to_field_value,limit_choices_to)
models.UserInfo.objects.filter(
**limit_choices_to,pk=obj.pk)
# models.UserInfo.objects.filter(**{"user_type_id":2},pk=obj.pk)

return HttpResponse("ok")

def index(request):
form
= ClassListForm()
return render(request,"index.html",{"form":form})

4、templates

index.html

<body>
{{ form.as_p }}
</body>