Django ORM常用操作介紹 (初級(jí))

圖片來(lái)源簡(jiǎn)書(shū)

??Django開(kāi)發(fā)過(guò)程中對(duì)表(model)的增刪改查是最常用的功能之一箱硕,本文介紹筆者在使用model 操作過(guò)程中遇到的一些操作潜叛。

1 model update常規(guī)用法

假如我們的表結(jié)構(gòu)是這樣的

class User(models.Model):
    username = models.CharField(max_length=255, unique=True, verbose_name='用戶(hù)名')
    is_active = models.BooleanField(default=False, verbose_name='激活狀態(tài)')

那么我們修改用戶(hù)名和狀態(tài)可以使用如下兩種方法:

方法一:

User.objects.filter(id=1).update(username='nick',is_active=True)

方法二:

_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()

方法一適合更新一批數(shù)據(jù),類(lèi)似于mysql語(yǔ)句 update user set username='nick' where id = 1

方法二適合更新一條數(shù)據(jù)砸脊,也只能更新一條數(shù)據(jù),當(dāng)只有一條數(shù)據(jù)更新時(shí)推薦使用此方法,另外此方法還有一個(gè)好處蒋伦,我們接著往下看

2 具有auto_now屬性字段的更新

我們通常會(huì)給表添加三個(gè)默認(rèn)字段

??自增ID,這個(gè)django已經(jīng)默認(rèn)加了焚鹊,就像上邊的建表語(yǔ)句痕届,雖然只寫(xiě)了username和is_active兩個(gè)字段,但表建好后也會(huì)有一個(gè)默認(rèn)的自增id字段

??創(chuàng)建時(shí)間末患,用來(lái)標(biāo)識(shí)這條記錄的創(chuàng)建時(shí)間爷抓,具有auto_now_add屬性,創(chuàng)建記錄時(shí)會(huì)自動(dòng)填充當(dāng)前時(shí)間到此字段

??修改時(shí)間阻塑,用來(lái)標(biāo)識(shí)這條記錄最后一次的修改時(shí)間蓝撇,具有auto_now屬性,當(dāng)記錄發(fā)生變化時(shí)填充當(dāng)前時(shí)間到此字段

就像下邊這樣的表結(jié)構(gòu)

class User(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='創(chuàng)建時(shí)間')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時(shí)間')
    username = models.CharField(max_length=255, unique=True, verbose_name='用戶(hù)名')
    is_active = models.BooleanField(default=False, verbose_name='激活狀態(tài)')

??當(dāng)表有字段具有auto_now屬性且你希望他能自動(dòng)更新時(shí)陈莽,必須使用上邊方法二的更新渤昌,不然auto_now字段不會(huì)更新,也就是:

_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()

3 json/dict類(lèi)型數(shù)據(jù)更新字段

??目前主流的web開(kāi)放方式都講究前后端分離走搁,分離之后前后端交互的數(shù)據(jù)格式大都用通用的json型独柑,那么如何用最少的代碼方便的更新json格式數(shù)據(jù)到數(shù)據(jù)庫(kù)呢?同樣可以使用如下兩種方法:

方法一:

data = {'username':'nick','is_active':'0'}
User.objects.filter(id=1).update(**data)
  • 同樣這種方法不能自動(dòng)更新具有auto_now屬性字段的值

  • 通常我們?cè)僮兞壳凹右粋€(gè)星號(hào)(*)表示這個(gè)變量是元組/列表私植,加兩個(gè)星號(hào)表示這個(gè)參數(shù)是字典

方法二:

data = {'username':'nick','is_active':'0'}
_t = User.objects.get(id=1)
_t.__dict__.update(**data)
_t.save()
  • 方法二和方法一同樣無(wú)法自動(dòng)更新auto_now字段的值
  • 注意這里使用到了一個(gè)dict方法

方法三:

_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()

4 ForeignKey字段更新

假如我們的表中有Foreignkey外鍵時(shí)忌栅,該如何更新呢?

class User(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='創(chuàng)建時(shí)間')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時(shí)間')
    username = models.CharField(max_length=255, unique=True, verbose_name='用戶(hù)名')
    is_active = models.BooleanField(default=False, verbose_name='激活狀態(tài)')
    role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')

方法一:

User.objects.filter(id=1).update(role=2)
  • 最簡(jiǎn)單的方法曲稼,直接讓給role字段設(shè)置為一個(gè)id即可
  • 當(dāng)然也可以用dict作為參數(shù)更新:
User.objects.filter(id=1).update(**{'username':'nick','role':3})

方法二:

_role = Role.objects.get(id=2)
User.objects.filter(id=1).update(role=_role)
  • 也可以賦值一個(gè)實(shí)例給role
  • 當(dāng)然也可以用dict作為參數(shù)更新:
_role = Role.objects.get(id=1)
User.objects.filter(id=1).update(**{'username':'nick','role':_role})

方法三

_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()
  • 注意:這里的role必須賦值為一個(gè)對(duì)象索绪,不能寫(xiě)id湖员,不然會(huì)報(bào)錯(cuò)"User.role" must be a "Role" instance
  • 當(dāng)使用dict作為參數(shù)更新時(shí)又有一點(diǎn)不同,如下代碼:
_t = User.objects.get(id=1)
_t.__dict__.update(**{'username':'nick','role_id':2})
_t.save()
  • Foreignkey外鍵必須加上_id瑞驱,例如:{'role_id':3}
  • role_id后邊必須跟一個(gè)id(int或str類(lèi)型都可)娘摔,不能跟role實(shí)例

5 ManyToManyField字段更新

假如我們的表中有ManyToManyField字段時(shí)更新又有什么影響呢?

class User(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='創(chuàng)建時(shí)間')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時(shí)間')
    username = models.CharField(max_length=255, unique=True, verbose_name='用戶(hù)名')
    is_active = models.BooleanField(default=False, verbose_name='激活狀態(tài)')
    role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')
    groups = models.ManyToManyField(Group, null=True, verbose_name='組')

m2m更新:m2m字段沒(méi)有直接更新的方法唤反,只能通過(guò)清空再添加的方法更新了

_t = User.objects.get(id=1)
_t.groups.clear()
_t.groups.add(*[1,3,5])
_t.save()
  • add():m2m字段添加一個(gè)值凳寺,當(dāng)有多個(gè)值的時(shí)候可用列表,參照上邊例子

_t.groups.add(2)

_t.groups.add(Group.objects.get(id=2))

  • remove():m2m字段移除一個(gè)值彤侍,肠缨,當(dāng)有多個(gè)值的時(shí)候可用列表,參照上邊例子

_t.groups.remove(2)

_t.groups.remove(Group.objects.get(id=2))

  • clear():清空m2m字段的值

6 Django model select的各種用法詳解

? 基本操作

# 獲取所有數(shù)據(jù)盏阶,對(duì)應(yīng)SQL:select * from User
User.objects.all()

# 匹配怜瞒,對(duì)應(yīng)SQL:select * from User where name = '運(yùn)維咖啡吧'
User.objects.filter(name='運(yùn)維咖啡吧')

# 不匹配,對(duì)應(yīng)SQL:select * from User where name != '運(yùn)維咖啡吧'
User.objects.exclude(name='運(yùn)維咖啡吧')

# 獲取單條數(shù)據(jù)(有且僅有一條般哼,id唯一)吴汪,對(duì)應(yīng)SQL:select * from User where id = 724
User.objects.get(id=123)

? 常用操作

# 獲取總數(shù),對(duì)應(yīng)SQL:select count(1) from User
User.objects.count()

# 獲取總數(shù)蒸眠,對(duì)應(yīng)SQL:select count(1) from User where name = '運(yùn)維咖啡吧'
User.objects.filter(name='運(yùn)維咖啡吧').count()

# 大于漾橙,>,對(duì)應(yīng)SQL:select * from User where id > 724
User.objects.filter(id__gt=724)

# 大于等于楞卡,>=霜运,對(duì)應(yīng)SQL:select * from User where id >= 724
User.objects.filter(id__gte=724)

# 小于,<蒋腮,對(duì)應(yīng)SQL:select * from User where id < 724
User.objects.filter(id__lt=724)

# 小于等于淘捡,<=,對(duì)應(yīng)SQL:select * from User where id <= 724
User.objects.filter(id__lte=724)

# 同時(shí)大于和小于池摧, 1 < id < 10焦除,對(duì)應(yīng)SQL:select * from User where id > 1 and id < 10
User.objects.filter(id__gt=1, id__lt=10)

# 包含,in作彤,對(duì)應(yīng)SQL:select * from User where id in (11,22,33)
User.objects.filter(id__in=[11, 22, 33])

# 不包含膘魄,not in,對(duì)應(yīng)SQL:select * from User where id not in (11,22,33)
User.objects.exclude(id__in=[11, 22, 33])

# 為空:isnull=True竭讳,對(duì)應(yīng)SQL:select * from User where pub_date is null
User.objects.filter(pub_date__isnull=True)

# 不為空:isnull=False创葡,對(duì)應(yīng)SQL:select * from User where pub_date is not null
User.objects.filter(pub_date__isnull=True)

# 匹配,like绢慢,大小寫(xiě)敏感灿渴,對(duì)應(yīng)SQL:select * from User where name like '%sre%',SQL中大小寫(xiě)不敏感
User.objects.filter(name__contains="sre")

# 匹配,like骚露,大小寫(xiě)不敏感蹬挤,對(duì)應(yīng)SQL:select * from User where name like '%sre%',SQL中大小寫(xiě)不敏感
User.objects.filter(name__icontains="sre")

# 不匹配荸百,大小寫(xiě)敏感,對(duì)應(yīng)SQL:select * from User where name not like '%sre%'滨攻,SQL中大小寫(xiě)不敏感
User.objects.exclude(name__contains="sre")

# 不匹配够话,大小寫(xiě)不敏感,對(duì)應(yīng)SQL:select * from User where name not like '%sre%'光绕,SQL中大小寫(xiě)不敏感
User.objects.exclude(name__icontains="sre")

# 范圍女嘲,between and,對(duì)應(yīng)SQL:select * from User where id between 3 and 8
User.objects.filter(id__range=[3, 8])

# 以什么開(kāi)頭诞帐,大小寫(xiě)敏感欣尼,對(duì)應(yīng)SQL:select * from User where name like 'sh%',SQL中大小寫(xiě)不敏感
User.objects.filter(name__startswith='sre')

# 以什么開(kāi)頭停蕉,大小寫(xiě)不敏感愕鼓,對(duì)應(yīng)SQL:select * from User where name like 'sh%',SQL中大小寫(xiě)不敏感
User.objects.filter(name__istartswith='sre')

# 以什么結(jié)尾菇晃,大小寫(xiě)敏感磺送,對(duì)應(yīng)SQL:select * from User where name like '%sre'估灿,SQL中大小寫(xiě)不敏感
User.objects.filter(name__endswith='sre')

# 以什么結(jié)尾馅袁,大小寫(xiě)不敏感,對(duì)應(yīng)SQL:select * from User where name like '%sre'大溜,SQL中大小寫(xiě)不敏感
User.objects.filter(name__iendswith='sre')

# 排序钦奋,order by朦拖,正序厌衔,對(duì)應(yīng)SQL:select * from User where name = '運(yùn)維咖啡吧' order by id
User.objects.filter(name='運(yùn)維咖啡吧').order_by('id')

# 多級(jí)排序富寿,order by,先按name進(jìn)行正序排列苏潜,如果name一致則再按照id倒敘排列
User.objects.filter(name='運(yùn)維咖啡吧').order_by('name','-id')

# 排序恤左,order by飞袋,倒序,對(duì)應(yīng)SQL:select * from User where name = '運(yùn)維咖啡吧' order by id desc
User.objects.filter(name='運(yùn)維咖啡吧').order_by('-id')

? 進(jìn)階操作

# limit蹄皱,對(duì)應(yīng)SQL:select * from User limit 3;
User.objects.all()[:3]

# limit,取第三條以后的數(shù)據(jù)锻拘,沒(méi)有對(duì)應(yīng)的SQL,類(lèi)似的如:select * from User limit 3,10000000歌豺,從第3條開(kāi)始取數(shù)據(jù)类咧,取10000000條(10000000大于表中數(shù)據(jù)條數(shù))
User.objects.all()[3:]

# offset馒铃,取出結(jié)果的第10-20條數(shù)據(jù)(不包含10,包含20),也沒(méi)有對(duì)應(yīng)SQL娃殖,參考上邊的SQL寫(xiě)法
User.objects.all()[10:20]

# 分組,group by炉爆,對(duì)應(yīng)SQL:select username,count(1) from User group by username;
from django.db.models import Count
User.objects.values_list('username').annotate(Count('id'))

# 去重distinct,對(duì)應(yīng)SQL:select distinct(username) from User
User.objects.values('username').distinct().count()

# filter多列卧晓、查詢(xún)多列芬首,對(duì)應(yīng)SQL:select username,fullname from accounts_user
User.objects.values_list('username', 'fullname')

# filter單列禀崖、查詢(xún)單列波附,正常values_list給出的結(jié)果是個(gè)列表,里邊里邊的每條數(shù)據(jù)對(duì)應(yīng)一個(gè)元組仅财,當(dāng)只查詢(xún)一列時(shí)碗淌,可以使用flat標(biāo)簽去掉元組,將每條數(shù)據(jù)的結(jié)果以字符串的形式存儲(chǔ)在列表中荆烈,從而避免解析元組的麻煩
User.objects.values_list('username', flat=True)

# int字段取最大值竟趾、最小值玫鸟、綜合诵次、平均數(shù)
from django.db.models import Sum,Count,Max,Min,Avg

User.objects.aggregate(Count(‘id’))
User.objects.aggregate(Sum(‘a(chǎn)ge’))

? 時(shí)間字段

# 匹配日期,date
User.objects.filter(create_time__date=datetime.date(2018, 8, 1))
User.objects.filter(create_time__date__gt=datetime.date(2018, 8, 2))

# 匹配年,year
User.objects.filter(create_time__year=2018)
User.objects.filter(create_time__year__gte=2018)

# 匹配月,month
User.objects.filter(create_time__month__gt=7)
User.objects.filter(create_time__month__gte=7)

# 匹配日壳坪,day
User.objects.filter(create_time__day=8)
User.objects.filter(create_time__day__gte=8)

# 匹配周纫骑,week_day
 User.objects.filter(create_time__week_day=2)
User.objects.filter(create_time__week_day__gte=2)

# 匹配時(shí),hour
User.objects.filter(create_time__hour=9)
User.objects.filter(create_time__hour__gte=9)

# 匹配分梅惯,minute
User.objects.filter(create_time__minute=15)
User.objects.filter(create_time__minute_gt=15)

# 匹配秒设预,second
User.objects.filter(create_time__second=15)
User.objects.filter(create_time__second__gte=15)


# 按天統(tǒng)計(jì)歸檔
today = datetime.date.today()
select = {'day': connection.ops.date_trunc_sql('day', 'create_time')}
deploy_date_count = Task.objects.filter(
    create_time__range=(today - datetime.timedelta(days=7), today)
).extra(select=select).values('day').annotate(number=Count('id'))

? Q 的使用

??Q對(duì)象可以對(duì)關(guān)鍵字參數(shù)進(jìn)行封裝,從而更好的應(yīng)用多個(gè)查詢(xún),可以組合&(and)辣苏、|(or)、~(not)操作符骏融。

例如下邊的語(yǔ)句

from django.db.models import Q

User.objects.filter(
    Q(role__startswith='sre_'),
    Q(name='公眾號(hào)') | Q(name='運(yùn)維咖啡吧')
)

轉(zhuǎn)換成SQL語(yǔ)句如下:

select * from User where role like 'sre_%' and (name='公眾號(hào)' or name='運(yùn)維咖啡吧')

??通常更多的時(shí)候我們用Q來(lái)做搜索邏輯误趴,比如前臺(tái)搜索框輸入一個(gè)字符树灶,后臺(tái)去數(shù)據(jù)庫(kù)中檢索標(biāo)題或內(nèi)容中是否包含

_s = request.GET.get('search')

_t = Blog.objects.all()
if _s:
    _t = _t.filter(
        Q(title__icontains=_s) |
        Q(content__icontains=_s)
    )

return _t

? 外鍵:ForeignKey

表結(jié)構(gòu):

class Role(models.Model):
    name = models.CharField(max_length=16, unique=True)


class User(models.Model):
    username = models.EmailField(max_length=255, unique=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE)
  • 正向查詢(xún):
# 查詢(xún)用戶(hù)的角色名
_t = User.objects.get(username='運(yùn)維咖啡吧')
_t.role.name
  • 反向查詢(xún):
# 查詢(xún)角色下包含的所有用戶(hù)
_t = Role.objects.get(name='Role03')
_t.user_set.all()
  • 另一種反向查詢(xún)的方法:
_t = Role.objects.get(name='Role03')

# 這種方法比上一種_set的方法查詢(xún)速度要快
User.objects.filter(role=_t)
  • 第三種反向查詢(xún)的方法:

如果外鍵字段有related_name屬性,例如models如下:

class User(models.Model):
    username = models.EmailField(max_length=255, unique=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE,related_name='roleUsers')

那么可以直接用related_name屬性取到某角色的所有用戶(hù)

_t = Role.objects.get(name = 'Role03')
_t.roleUsers.all()

? M2M:ManyToManyField

表結(jié)構(gòu):

class Group(models.Model):
    name = models.CharField(max_length=16, unique=True)

class User(models.Model):
    username = models.CharField(max_length=255, unique=True)
    groups = models.ManyToManyField(Group, related_name='groupUsers')
  • 正向查詢(xún):
# 查詢(xún)用戶(hù)隸屬組
_t = User.objects.get(username = '運(yùn)維咖啡吧')
_t.groups.all()
  • 反向查詢(xún):
# 查詢(xún)組包含用戶(hù)
_t = Group.objects.get(name = 'groupC')
_t.user_set.all()

同樣M2M字段如果有related_name屬性筷笨,那么可以直接用下邊的方式反查

_t = Group.objects.get(name = 'groupC')
_t.groupUsers.all()
get_object_o

? get_or_create

顧名思義昌跌,查找一個(gè)對(duì)象如果不存在則創(chuàng)建仰禀,如下:

object, created = User.objects.get_or_create(username='運(yùn)維咖啡吧')

返回一個(gè)由object和created組成的元組,其中object就是一個(gè)查詢(xún)到的或者是被創(chuàng)建的對(duì)象答恶,created是一個(gè)表示是否創(chuàng)建了新對(duì)象的布爾值

實(shí)現(xiàn)方式類(lèi)似于下邊這樣:

try:
    object = User.objects.get(username='運(yùn)維咖啡吧')

    created = False
exception User.DoesNoExist:
    object = User(username='運(yùn)維咖啡吧')
    object.save()

    created = True

returen object, created

? 執(zhí)行原生SQL

??Django中能用ORM的就用它ORM吧,不建議執(zhí)行原生SQL,可能會(huì)有一些安全問(wèn)題映企,如果實(shí)在是SQL太復(fù)雜ORM實(shí)現(xiàn)不了浴麻,那就看看下邊執(zhí)行原生SQL的方法,跟直接使用pymysql基本一致了

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute('select * from accounts_User')
    row = cursor.fetchall()

return row

注意這里表名字要用app名+下劃線+model名的方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焚挠,一起剝皮案震驚了整個(gè)濱河市榛泛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噩斟,老刑警劉巖曹锨,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剃允,居然都是意外死亡沛简,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)斥废,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椒楣,“玉大人,你說(shuō)我怎么就攤上這事营袜∪龆伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵荚板,是天一觀的道長(zhǎng)凤壁。 經(jīng)常有香客問(wèn)我吩屹,道長(zhǎng),這世上最難降的妖魔是什么拧抖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任煤搜,我火速辦了婚禮,結(jié)果婚禮上唧席,老公的妹妹穿的比我還像新娘擦盾。我一直安慰自己,他們只是感情好淌哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布迹卢。 她就那樣靜靜地躺著,像睡著了一般徒仓。 火紅的嫁衣襯著肌膚如雪腐碱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天掉弛,我揣著相機(jī)與錄音症见,去河邊找鬼。 笑死殃饿,一個(gè)胖子當(dāng)著我的面吹牛谋作,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乎芳,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遵蚜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了秒咐?” 一聲冷哼從身側(cè)響起谬晕,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碘裕,失蹤者是張志新(化名)和其女友劉穎携取,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體帮孔,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷滋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文兢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晤斩。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姆坚,靈堂內(nèi)的尸體忽然破棺而出澳泵,到底是詐尸還是另有隱情,我是刑警寧澤兼呵,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布兔辅,位于F島的核電站腊敲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏维苔。R本人自食惡果不足惜碰辅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望介时。 院中可真熱鬧没宾,春花似錦、人聲如沸沸柔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褐澎。三九已至羹蚣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乱凿,已是汗流浹背顽素。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徒蟆,地道東北人胁出。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像段审,于是被迫代替她去往敵國(guó)和親全蝶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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