我正在尝试为Django模型实现通用的软删除模式。
为模型提供一个is_deleted字段,该字段将已删除的对象保留在DB中,但出于所有实际目的将其隐藏:应遵循级联等所有常规规则,但实际删除除外。但是,管理应用程序仍应能够使用已删除的对象,以擦除(确定将其丢弃)或还原它们。(请参见下面的代码)
问题:这会中断级联。我原本希望发生的事情是通过我在模型和自定义查询集上覆盖的方法来进行级联。实际发生的是,它们被默认的查询集/管理器绕过,默认查询集/管理器也恰好使用了快速的_raw_delete内部API。因此,要么不会发生级联删除,要么如果我在模型上调用super()。delete()方法(此后再调用save()),则对相关对象执行标准删除。
我已经尝试了“使用自定义模型删除方法进行级联删除”中的建议,但是这很糟糕—除了提倡使用已弃用的use_for_related_fields管理器属性。
我开始认为,要实现我的目标就不可能不影响Django私有对象的主要区别-很奇怪,因为这种软删除行为是许多DBMS情况下的标准模式。
这是我现在的位置:
我为具有is_deleted字段的对象创建了自定义管理器和查询集:
from django.db import models
from django.db.models.query import QuerySet
class SoftDeleteQuerySet(QuerySet):
#/sf/ask/2022736621/
def __init__(self,*args,**kwargs):
return super(self.__class__,self).__init__(*args,**kwargs)
def delete(self,*args,**kwargs):
for obj in self: obj.delete()
#http://codespatter.com/2009/07/01/django-model-manager-soft-delete-how-to-customize-admin/
# but use get_queryset, not get_query_set !!!
class SoftDeleteManager(models.Manager):
""" Use this manager to get objects that have a is_deleted field """
def get_queryset(self,*args,**kwargs):
return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter(is_deleted=False)
def all_with_deleted(self,*args,**kwargs):
return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter()
def deleted_set(self,*args,**kwargs):
return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter(is_deleted=True)
def get(self, *args, **kwargs):
""" if …Run Code Online (Sandbox Code Playgroud)根据主题,我收到一个POST请求.我想将它转换为等效的GET请求并将其传递给模板(因此我可以在点击排序列标题中将其用作href目标).
是否有预先制作的方式来做,或者我需要自己动手?
干杯,alf
UPDATE
这是我最终使用的.我需要request.REQUEST,所以request.POST.urlencode没有删除它,而request.REQUEST没有urlencode.
import urllib
def buildqs(request):
"Builds a GET-style query string form http-request"
#also request.POST.urlencode is possible -
#Sadly, request.REQUEST does not have urlencode
return urllib.urlencode(request.REQUEST)+"&"
Run Code Online (Sandbox Code Playgroud) 在一个cordova Android应用程序(滚动到底部的设备,版本,插件列表,所有这些都是最新的写作)我想优先存储外部SD卡上的文件,并使用内部存储,如果SDCard不存在.我将保存路径设置为:
persistentFS= cordova.file.externalDataDirectory||cordova.file.DataDirectory||fileSystem.root.toURL();
它的最终值是file:///storage/emulated/0/Android/data/com.fubar.app/files/,与cordova.file.externalDataDirectory相同.
我
<access origin="cdvfile://*" />
...
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="files-external,sdcard,files,documents,cache,cache-external,root" />
在config.xml中
设置了:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在AndroidManifest.xml中并在index.html Security metatag中设置各种附魔.我添加了一个SD卡插入,写入启用,我确认我可以写入 - 例如 - 文件管理器.它包含Android/data/com.fubar.myapp/files /文件夹.
一切都是:文件被写入 - 并从内部设备存储读取.我已经阅读了关于这个主题的所有谷歌,但没有任何东西让我更接近任务(一些人建议使用文件系统根插件,但它似乎已被文件插件包含).
任何提示?TIA,alf
编辑:使用adb shell,我可以看到应用程序的外部sdcard文件文件夹的绝对路径为:
`/storage/extSdCard/Android/data/com.fubar.myapp/files`
Run Code Online (Sandbox Code Playgroud)
并调用resolveLocalFileSystemURL
file:///storage/extSdCard/Android/data/com.fubar.myapp/files
愉快地成功.我不认为这是要走的路,因为该路径取决于设备.
设备:Samsung Galaxy tab 10.5,lollipop 5.0.1使用cordova 5.3.1,带插件:cordova-plugin-device 1.0.1"Device"cordova-plugin-dialogs 1.1.1"Notification"cordova-plugin-file 3.0.0 "文件"cordova-plugin-file-transfer 1.3.0"文件传输"cordova-plugin-media 1.0.1"媒体"cordova-plugin-whitelist 1.1.0"白名单"
构建主机是Linux FC21
对于 js console.log 拦截器的通常建议(Capturing javascript console.log?)在两个方面都存在不足,都很严重:
(i) 实际浏览器控制台中的所有调用现在似乎都来自同一行——定义新函数的地方——而不是调用完成的地方
(ii) 截取的参数还没有像这样格式化console.log(即%替换好东西,%o特别是):
(function() {
function send_stuff(){ /* Deal with console arguments. */ }
var oldLog=console.log;
console.log=function(msg) {
oldLog.apply(this,arguments);
send_stuff(Array.prototype.slice.call(arguments).join());
}
}())
console.log("test");
console.log("Hello %s", "Bob");
console.log("Here is an object %o", { stuff: "thing" });Run Code Online (Sandbox Code Playgroud)
也许已经设计了更好的东西(例如能够捕获 console.log 的实际缓冲区内容的东西)。
编辑: 为了澄清多个参数失败:除了扩展文件/行信息之外,console.log 还做了一些巧妙的替换 - a-la-printf - % 序列。特别有趣的是 %o 序列,其中扩展了后续对象的深度转储,并被浏览器的控制台窗口很好地利用。这是无法复制的,除非人们愿意基本上重新实现其逻辑(不必要并且很可能效率低下)
干杯,
这应该很容易,但对于我的生活,我无法弄明白.我想制作一堆盒子,如下图所示:
+------------------+
| +------o-------+ |
| | Banner | |
| +------o-------+ |
| | Buttons | |
| | | |
| +------o-------+ |
| | | |
| | | |
| | ViewFlipper | |
| | | |
| | | |
| | | |
| | | |
| +------o-------+ |
| | Buttons | |
| +------o-------+ |
| | Footer | |
| +------o-------+ |
+------------------+
Run Code Online (Sandbox Code Playgroud)
每个框 - 包括外部框 - 表示包含其他窗口小部件(甚至是单独的窗口小部件)的布局.外框与设备的宽度和高度相匹配.堆栈的宽度和高度必须与外部容器匹配.盒子的边缘彼此粘合并粘合到容器的顶部和底部边缘,如'o'所示.所有内部布局都紧紧包裹其内容,除了最大的 - …
我需要在linux机器上安装一些软件包.由于各种原因,一些(少数)软件包可能会丢失(操作系统版本,基本上)
- vars:
pkgs:
- there_1
- not_there_1
- there_2
...
Run Code Online (Sandbox Code Playgroud)
但我也希望从一本剧本中管理它们.所以我不能把它们全部集中在一起
yum: state=latest name="{{pkgs}}"
Run Code Online (Sandbox Code Playgroud)
因为丢失的包会弄乱事务,所以什么也没有安装.
然而,明显(和缓慢)一个一个安装也失败了,因为第一个丢失的包将整个循环从水中吹出,因此:
- name Packages after not_there_1 are not installed
yum: state=latest name="{{item}}"
ignore_errors: yes
with_items: "{{ pkgs }}"
Run Code Online (Sandbox Code Playgroud)
有没有办法忽略循环中的错误,以便所有项目都有机会?(即安装错误表现为continue循环中的一个)
android ×2
django ×2
ansible ×1
cordova ×1
javascript ×1
linux ×1
python ×1
query-string ×1
sd-card ×1
yum ×1