オリジナル:http://106.13.73.98/__/72/
@
さて、今、私たちはこのような要求を持って、私たちのショッピングモールは、多くの商品がありますが、お祭りが来て、私たちは活動を行います。
だから、私たちはクーポンを設計する必要があり、クーポンは、それをどのように入力されていますか?割引のフルカット、待機などのように...
私たちは、のようなクーポン、のための製品設計の種類活動の種類に対応:
家電製品の商品です、食品の商品です、そして我々は、家電製品の割引クーポンを設計だけでなく、食品のクーポンを完全に削減することができます。
そこで、我々は、便利なテーブル構造が出てきます:
from django.db import models
is_true = {'null': True, 'blank': True}
# 家用电器表
class Appliance(models.Model):
"""
id name
1 冰箱
2 电视
3 洗衣机
"""
name = models.CharField(max_length=64)
# 食品表
class Food(models.Model):
"""
id name
1 面包
2 牛掰
"""
name = models.CharField(max_length=64)
# 水果表
class Fruit(models.Model):
"""
id name
1 苹果
2 香蕉
"""
name = models.CharField(max_length=64)
# class ...
# 优惠卷表
class Coupon(models.Model):
"""
id title appliance_id food_id fruit_id
1 通用优惠卷 null null null
2 冰箱折扣券 1 null null
3 电视折扣券 2 null null
4 苹果满减卷 null null 1
"""
title = models.CharField(max_length=64)
appliance = models.ForeignKey(to='Appliance', **is_true)
food = models.ForeignKey(to='Food', **is_true)
fruit = models.ForeignKey(to='Fruit', **is_true)
# ...
# 实际上我们的商品种类会特别多,导致我们这张表的外键也越来越多
誰もが知っているように、我々の偉大なDjangoは私たちの次のために高い使用率を提供しなければならない- ContentType
。アセンブリを
***
理解
ContentType
Djangoは、あなたがすべてのプロジェクトを追跡することができるアプリケーションに組み込まれているAPP
とmodel
の対応関係を、とcontentTypeテーブルに記録します。
私たちが行うとデータ移行プロジェクトが含まれる、データベース内のいくつかのDjangoの独自のテーブルを生成しますdjango_content_type
テーブルを。
のは、この表を見てみましょう:
のは、この表のデフォルトのデータを見てみましょう。
見て分かるように、APPとそのデータシートとの間の自動マッピングの確立に
***
テーブル構造
ステップ
- モデルで定義されている
ForeignKey
フィールドとにリンクされているContentType
テーブル、通常のフィールドとして指定されましたcontent-type
。 - で定義されたモデルでは
PositiveIntergerField
、フィールド、外部キーの主キーテーブル記憶工程は、通常、このフィールドで指定されていますobject_id
。 - モデルで定義された
GenericForeignKey
上記の二つのフィールドの名前を渡して、フィールド。 - 便宜上、逆クエリは、外部キーテーブルの中で定義することができ
GenericRelation
、フィールドと外部キーテーブルを作成するためのポイント。
さて、テーブルの構造や、上記の手順の開口部の一例によると、私たちの新しいテーブル構造が発表されました:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
# 家用电器表
class Appliance(models.Model):
name = models.CharField(max_length=64)
# 4. 为了方便反向查询,可在被外键表中定义GenericRelation字段并指向创建外键的表
coupons = GenericRelation(to='Coupon')
# 食物表
class Food(models.Model):
name = models.CharField(max_length=64)
# 水果表
class Fruit(models.Model):
name = models.CharField(max_length=64)
# 优惠卷表
class Coupon(models.Model):
title = models.CharField(max_length=64)
# 1. 在model中定义ForeignKey字段,并关联到ContentType表
content_type = models.ForeignKey(to=ContentType) # 这里就不要加引号了
# 2. 在model中定义PositiveIntergerField字段,用来存储步骤一中被外键的表中的主键
object_id = models.PositiveIntegerField()
# 3. 在model中定义GenericForeignKey字段,传入上面两个字段的名字.
content_object = GenericForeignKey('content_type', 'object_id')
データ移行後、django_content_type
テーブルは自動的にAPPおよびその対応するフィールドモデルを増大させます。
使用
まず、我々はいくつかのデータを準備します
# 在Python脚本中调用Django环境 import os if __name__ == '__main__': # 注意将下面的'blog097.settings'改为对应的配置文件路径 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog097.settings') import django django.setup() from blog import models [models.Appliance.objects.create(name=i) for i in ("冰箱", "电视", "洗衣机")] [models.Food.objects.create(name=i) for i in ("面包", "牛奶")] [models.Fruit.objects.create(name=i) for i in ("苹果", "香蕉")]
あなたがこれを理解できない場合は、ボーエンを見ることができます:[ジャンゴPythonスクリプトで呼び出す環境]
そして、私たちのORM操作を開始
# 在Python脚本中调用Django环境 import os if __name__ == '__main__': # 注意将下面的'blog097.settings'改为对应的配置文件路径 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog097.settings') import django django.setup() from blog import models from django.contrib.contenttypes.models import ContentType """通过ContentType获得表名""" content_type_obj = ContentType.objects.filter(app_label='blog', model='appliance').first() # 打印结果:appliance """获得表内的所有对象,相当于models.Applicance""" model_class = content_type_obj.model_class() # <class 'blog.models.Appliance'> obj_list = model_class.objects.all() [print(obj.name) for obj in obj_list] # 冰箱、电视、洗衣机 """为冰箱添加一条优惠记录""" ice_box = models.Appliance.objects.filter(name="冰箱").first() models.Coupon.objects.create(title="冰箱折扣券", content_object=ice_box) """查询冰箱的所有优惠卷""" # 我们定义了反向查询 coupon_list01 = ice_box.coupons.all() [print(coupon.title) for coupon in coupon_list01] # 如果没有定义反向查询 coupon_list02 = models.Coupon.objects.filter(content_type=content_type_obj, object_id=ice_box.id).all() [print(coupon.title) for coupon in coupon_list02]