分享

Django中ForeignKey参数的使用

 zhou网摘 2018-03-01

limit_choices_to:

from django.db import models
from django.contrib.auth.models import User
from django.db.models import Q


class Book(models.Model):
name = models.CharField(max_length=20)
user = models.ForeignKey(User, limit_choices_to={'is_staff': True})
#user = models.ForeignKey(User, limit_choices_to=Q(is_staff=True))
    def __unicode__(self):
        return self.name

>>>Book.objects.filter(user=u)

>>>User.objects.filter(Book__name__startswith='hhh')


limit_choices_to可以使用字典的形式来表示,也可以用Q来表示,如上实例所示。

但是当使用Q的形式来表示时,那么用到limit_choices_to的字段就不要出现在raw_id_fields中,否则将会失效。而字典的形式照常生效。

class BookAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'user']
raw_id_fields = ('user',)
admin.site.register(Book, BookAdmin)

这样的话,limit_choices_to的作用就会失效。

related_name:

当一张表的多个字段指向同一张表时,会出错。系统无法知道,通过另外一张表,访问XXX_set属性访问到的是哪个属性。这时,我们就需要为每个字段定义一个related_name属性,另外一张表访问这个表时,就会根据related_name的值来得到各个属性了。

例子:

[python] view plaincopy
  1. class dutyTeam(models.Model):  
  2.     ''''' 
  3.     这里必须定义related_name属性。 
  4.     '''  
  5.     first=models.ForeignKey(watch,verbose_name='第一值班人',related_name='first')  
  6.     second=models.ForeignKey(watch,related_name='second',verbose_name='备用值班人')  
  7.     urgent=models.ForeignKey(watch,related_name='urgent',verbose_name='紧急联系人')  

当定义了related_name后”_set”这类查询就被related_name代替了,所以用”_set”会报错。

如果related_name=‘+’或者以‘+’结束:‘user+',那么就无法实现逆向查询了。

参数 描述
edit_inline 若取值非假, 这个关联对象就是可内联编辑的.这也意味着这个对象没有自己的管理界面.取值可以是 models.TABULAR 或 models.STACKED, 分别表示内联可编辑对象是显示成表格形式还是一个字段集栈的形式.
limit_choices_to

一个参数和值的字典(参阅`数据库API参考`_)用来限制 admin 针对该对象的可选项. 使用models.LazyDate 值来按日期限制该对象的选择项,举例来说:

limit_choices_to = {'pub_date__lte' : models.LazyDate()}

只允许关联对象的pub_date在当前日期之前的才可以被选择.

本参数与 edit_inline 不相容.

max_num_in_admin

对内联编辑对象来说,这是在 amdin 中可显示的关联对象的最大值. 这样, 如果说一只比萨饼最多加10种浇头,那么 max_num_in_admin=10 将确保没有一个超过十种.

这并不说是比萨斜塔只有十层高...比萨斜塔是可以有更多层的.这个参数仅仅控制admin界面.

min_num_in_admin 在admin中显示的关联对象的最小值. 正常情况,在创建阶段显示 num_in_admin 个内联对象, 在编辑阶段,除了预先存在的关联对象外, 显示 num_extra_on_change 个空对象.不过, 无论何种情况,至少会有 min_num_in_admin 个关联对象被显示出来.
num_extra_on_change 在编辑阶段显示的额外的空白关联对象字段数.
num_in_admin 在添加一个对象时显示的其内联对象的默认数量
raw_id_admin

为即将得到的整数值(id值)显示一个文本框而不是一个下拉菜单. 在关联对象有很多很多行时.使用它就比使用一个 <select> 更实用.

不能与 edit_inline 一起使用.

related_name

关系名字. 举例来说, 如果 Topping 对象拥有字段:

models.ForeignKey(Pizza)

related_name 将会是 "topping_set" (取自  的名字), Pizza 对象会自动拥有 topping_set对象集描述符.

不过若你在 Topping 类中做如下定义的话:

models.ForeignKey(Pizza, related_name="munchie")

则 Topping 的对象集描述符就变为 munchie.

只有当一个对象要被另一个对象关联不止一次时, 这个参数才真正有用. 举例来说, 如果一个Story 对象既有 primary_category 字段又有 secondary_category 字段. 为了确保Category 对象拥有正确的对象集描述符,你要这样使用这些字段.:

models.ForeignKey(Category, related_name="primary_storys")
models.ForeignKey(Category, related_name="secondary_storys")

...这样 Category 对象才会自动拥有 primary_storys 和 secondary_storys 对象集描述符.

to_field 被关联对象的用于关联的字段. 默认情况, Django 使用被关联对象的主键


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多