小编clw*_*ght的帖子

如何切换Django OneToOneField的方向?

我目前有几个模型设置如下:

from django.db import models

class Child(models.Model):
    child_name = models.CharField(max_length=200)

class Parent(models.Model):
    parent_name = models.CharField(max_length=200)
    child = models.OneToOneField(Child, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

不幸的是这是错误的,因为我希望删除父级以级联到子级而不是反之亦然,所以我真的应该让它们像这样设置:

class Parent(models.Model):
    parent_name = models.CharField(max_length=200)

class Child(models.Model):
    child_name = models.CharField(max_length=200)
    child = models.OneToOneField(Parent)
Run Code Online (Sandbox Code Playgroud)

假设我目前没有孤儿,我怎样才能设置django迁移,使我的数据保持不变?我正在使用Postgres数据库,如果这有任何区别.

django django-models django-migrations

5
推荐指数
1
解决办法
879
查看次数

如何在保存期间排除django模型字段?

我有一个相当复杂的Django模型,其中包含一些只能在某些情况下保存的字段.举个简单的例子,

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=200)
    counter = models.IntegerField(default=0)

    def increment_counter(self):
        self.counter = models.F('counter') + 1
        self.save(update_fields=['counter'])
Run Code Online (Sandbox Code Playgroud)

这里我使用F表达式来增加计数器时避免竞争条件.我通常永远不会想要将increment_counter函数的值保存在函数之外,因为这可能会撤消从另一个线程或进程调用的增量.

所以问题是,在模型的保存功能中,默认情况下排除某些字段的最佳方法是什么?我尝试了以下内容

def save(self, **kwargs):
    if update_fields not in kwargs:
        update_fields = set(self._meta.get_all_field_names())
        update_fields.difference_update({
            'counter',
        })
        kwargs['update_fields'] = tuple(update_fields)
    super().save(**kwargs)
Run Code Online (Sandbox Code Playgroud)

但结果是ValueError: The following fields do not exist in this model or are m2m fields: id.我当然可以id在差异更新中添加和任何m2m字段,但这开始看起来像一个不可维护的混乱,特别是一旦其他模型开始引用这个,这将添加self._meta.get_all_field_names()需要排除的其他名称update_fields.

对于它的价值,我主要需要这个功能来与django管理站点进行交互; 代码中的每个其他位置都可以相对轻松地调用model_obj.save()正确的update_fields.

django django-models

5
推荐指数
1
解决办法
1817
查看次数

从压扁的树枝上分出

假设我有以下git的历史:一个主分支开始犯A,一个feature-1分支分支的关闭A与提交BC,第二特性分支feature-2所建立起来的承诺关闭C与提交DE

master     A
            \
feature-1    B--C
                 \
feature-2         D--E
Run Code Online (Sandbox Code Playgroud)

现在假设提交C已经过测试并准备好合并,所以我们使用git switch master; git merge feature-1 --squash.

master     A------C'
            \    /
feature-1    B--C
                 \
feature-2         D--E
Run Code Online (Sandbox Code Playgroud)

master 的历史记录很好而且干净,只有提交AC',但是如果我们现在想要比较masterfeature-2(例如,git log master..feature-2),我们最终会看到所有提交feature-1都已经合并了。

问题 1:是否有一种简单的方法可以feature-2压缩历史以匹配压缩的合并?如果什么历史是一个有点复杂,它的分支点后有更多的提交Cfeature-1那名壁球合并成高手?

问题 2:假设重写历史很困难(或者只能用 很乏味地完成git rebase -i;我在每个分支上有两个以上的提交),有没有办法只查看 …

git pull-request git-squash

5
推荐指数
1
解决办法
424
查看次数