Django之同時(shí)新增數(shù)據(jù)到兩個(gè)數(shù)據(jù)庫表與同時(shí)返回兩個(gè)表的數(shù)據(jù)(插拔式)

  • models:比如有以下三個(gè)模型
from django.db import models

"""
基類,其他類繼承即可獲得對應(yīng)的字段
""" 
class BaseModel(models.Model):
    updated_tm = models.DateTimeField(auto_now=True)
    created_tm = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True

"""
項(xiàng)目列表
"""
class ProjectList( BaseModel):
    project_id = models.AutoField(help_text="項(xiàng)目ID", primary_key=True)
    project_name = models.SlugField(max_length=128, help_text="項(xiàng)目名稱", unique=True)

    class Meta:
        db_table = 'project_list'
        verbose_name = '項(xiàng)目列表信息'
        verbose_name_plural = verbose_name

"""
項(xiàng)目詳情
"""
class ProjectDetail(BaseModel):
    project_introduction = models.CharField(max_length=128, help_text="用戶簡介")
    project_info = models.ForeignKey(to=ProjectList, on_delete=models.DO_NOTHING, db_constraint=False, related_name='user')

    class Meta:
        db_table = project_detail'
        verbose_name = '項(xiàng)目詳情信息'
        verbose_name_plural = verbose_name
一带膜、同時(shí)新增數(shù)據(jù)到兩個(gè)數(shù)據(jù)庫表
  • views
from rest_framework import filters, mixins, generics
from rest_framework.viewsets import GenericViewSet


class ProjectListView(mixins.CreateModelMixin, GenericViewSet):
    queryset = Account.objects.filter(is_delete=0).all().order_by("-created_tm")

def create(self, request, *args, **kwargs):
    # 先定義兩個(gè)dict 
    project_list_dict = {}
    project_detail_dict = {}

    # 使用 ._meta.get_fields() 獲取數(shù)據(jù)庫表的全部字段,再使用field.name獲取全部的字段名稱鸳谜,放入各自的dict膝藕,不存在的自動(dòng)忽略掉
    for item in request.data.items():
        if item in [field.name for field in ProjectList._meta.get_fields()]:
            project_list_dict [item[0]] = item[1]
        elif item in [field.name for field in ProjectDetail._meta.get_fields()]:
            project_detail_dict [item[0]] = item[1]

    # 從上面的models可以看到,項(xiàng)目詳情與項(xiàng)目列表兩張表是有關(guān)聯(lián)的咐扭,所以芭挽,新增數(shù)據(jù)的時(shí)候懒棉,先現(xiàn)在列表,新增成功览绿,生成ID后,再新增詳情穗慕,并通過ID與列表數(shù)據(jù)關(guān)聯(lián)起來
    # 檢查項(xiàng)目是否存在饿敲,項(xiàng)目名稱唯一約束,Serializer內(nèi)設(shè)置必填
        try:
            # 存在就直接失敗
            ProjectList.objects.get(project_name=request.data.get('project_ame'))
            return xxx
        except Account.DoesNotExist:
            # 如果不存在逛绵,先調(diào)用ProjectList表新增數(shù)據(jù)
            try:
                project_create = ProjectList.objects.update_or_create(defaults=project_list_dict, project_name=project_list_dict["project_ame"])
                # 如果ProjectList表新增數(shù)據(jù)成功怀各,則通過project_info,在ProjectDetail新增對應(yīng)的數(shù)據(jù)
                if project_create:
                    project_id = ProjectList.objects.filter(project_name=project_list_dict["project_ame"]).values('project_id').first()
                    ProjectDetail.objects.update_or_create(defaults=project_detail_dict, project_info=project_id["project_id"])
                    return xxx
            except Exception as e:
                return e
二术浪、同時(shí)返回兩個(gè)表的數(shù)據(jù)(插拔式)
  • 插拔式的好處:即插即用瓢对,需要時(shí)才調(diào)用,不需要?jiǎng)t不調(diào)用
  • 從ProjectDetail這個(gè)models我們可以看到胰苏,是沒有定義project_id和project_name的硕蛹,但我們是與ProjectList關(guān)聯(lián)的,所以硕并,我們可以通過project_info法焰,返回ProjectList已定義的project_id和project_name
# 我們只需要把ProjectDetail改成以下這樣子就可以了
class ProjectDetail(BaseModel):
    project_introduction = models.CharField(max_length=128, help_text="用戶簡介")
    project_info = models.ForeignKey(to=ProjectList, on_delete=models.DO_NOTHING, db_constraint=False, related_name='user')

    class Meta:
        db_table = project_detail'
        verbose_name = '項(xiàng)目詳情信息'
        verbose_name_plural = verbose_name

    @property
    def  project_id(self):
        return self.project_info.project_id

    @property
    def  project_name(self):
        return self.project_info.project_name

# 然后在序列化器內(nèi)直接調(diào)用project_id和project_name即可
class ProjectDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectDetail

        fields = ('project_id', 'project_name', 'project_introduction',)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倔毙,隨后出現(xiàn)的幾起案子埃仪,更是在濱河造成了極大的恐慌,老刑警劉巖陕赃,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵蛉,死亡現(xiàn)場離奇詭異,居然都是意外死亡么库,警方通過查閱死者的電腦和手機(jī)傻丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诉儒,“玉大人桑滩,你說我怎么就攤上這事≡识茫” “怎么了运准?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缭受。 經(jīng)常有香客問我胁澳,道長,這世上最難降的妖魔是什么米者? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任韭畸,我火速辦了婚禮宇智,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胰丁。我一直安慰自己随橘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布锦庸。 她就那樣靜靜地躺著机蔗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘萧。 梳的紋絲不亂的頭發(fā)上萝嘁,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音扬卷,去河邊找鬼牙言。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怪得,可吹牛的內(nèi)容都是我干的咱枉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼徒恋,長吁一口氣:“原來是場噩夢啊……” “哼庞钢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起因谎,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤基括,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后财岔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體风皿,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年匠璧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桐款。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夷恍,死狀恐怖魔眨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酿雪,我是刑警寧澤遏暴,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站指黎,受9級特大地震影響朋凉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜醋安,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一杂彭、第九天 我趴在偏房一處隱蔽的房頂上張望墓毒。 院中可真熱鬧,春花似錦亲怠、人聲如沸所计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽主胧。三九已至,卻和暖如春徙垫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背放棒。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工姻报, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人间螟。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓吴旋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厢破。 傳聞我的和親對象是個(gè)殘疾皇子荣瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容