django foreignkey高级用法

forienkey 通过属性限制

staff_member = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    limit_choices_to={'is_staff': True},
) 

forienkey 通过函数限制

def limit_pub_date_choices():
    return {'pub_date__lte': datetime.date.utcnow()}

limit_choices_to = limit_pub_date_choices

forienkey 反查

# Declare the ForeignKey with related_query_name
class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)

# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")

反查代码

from django.db import models

# Create your models here.
class Article(models.Model):
    ar_name=models.CharField(max_length=255)
    def __str__(self):
        return self.ar_name

class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)
    def __str__(self):
        return self.ar_name+' '+self.article.ar_name

'''
# 初始化数据
from CForientApp.models import *
Article(ar_name='a1111').save()
Article(ar_name='a2222').save()
Article(ar_name='a3333').save()
Article(ar_name='a4444').save()
a5=Article(ar_name='a4444')
a6=Article(ar_name='a4444')
a5.save()
a6.save()
Tag(article=a5,name='tag01').save()

from CForientApp.models import *
Article.objects.filter(tag__name='tag01')
Article.objects.exclude(tag__name='tag01')
'''
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容