小编Bum*_*Bee的帖子

django m2m_changed与自定义模型

在Django中,我确实有两个模型"作者"和"出版物",它们与多对多字段相关联,因此我可以将不同的作者分配给出版物.此外,我必须使用自定义直通模型"作者"来定义正确的顺序.

class Author(models.Model):
    first_name = models.CharField(max_length=48)
    .....


class Authorship(models.Model):
    author = models.ForeignKey(Author)
    publication = models.ForeignKey('Publication')
    order_of_authorship = models.IntegerField(default=1)


class Publication(models.Model):
    title = models.CharField(max_length=128)
    authors = models.ManyToManyField(Author, through=Authorship)
    year = models.IntegerField(max_length=4)
    ...

    citation_key = models.CharField(max_length=9, blank=True, default="")
Run Code Online (Sandbox Code Playgroud)

目前,我使用管理界面使用"发布"的表单和内联表单"作者"填充我的数据.

我现在想要实现的目标:在数据发生变化后,应自动填充额外的citation_key-field(例如"Einstein1950").

我试图做的事情:我发现使用信号必须是最好的做法.

但是,当我更改作者身份时,不会触发"publicationm_changed" - "Publication.authors.through"上的信号.

@receiver(m2m_changed, sender=Publication.authors.through)
def authors_changed(sender, **kwargs):
    print("authors changed")
Run Code Online (Sandbox Code Playgroud)

相关主题中也讨论了这个问题,其中作者似乎在直通模型上使用"post_save".

@receiver(post_save, sender=Authorship)
def authorship_changed(sender, instance, **kwargs):
    print("authors changed")
Run Code Online (Sandbox Code Playgroud)

这似乎有用,但我必须记住,还没有涵盖删除,所以我添加了post_delete信号:

@receiver(post_delete, sender=Authorship)
def authorship_deleted(sender, instance, **kwargs):
    print("authors deleted")
Run Code Online (Sandbox Code Playgroud)

现在的问题是:如果我添加4个作者,我会将该事件触发4次.如果我想如前所述更新我的citation_key,这也会发生4次.

这可能是正确的解决方案吗?还是有更好的最佳做法?我认为它必须以某种方式使用m2m_changed信号,但我不知道如何.由于我是Django的新手,我不知道这对你来说是否是一个明显的解决方案.此外,在这种情况下,不必要的计算不应该产生巨大的影响,但它并不好.

我只在Django-Trac中发现了一个非常老的错误报告,似乎也解决了这个问题.但还没有解决方案.

django django-signals django-models

9
推荐指数
1
解决办法
996
查看次数

在rmarkdown中使用kable打印因子的频率表

我在R中有一个因子,它由a,b和c级组成.数据由2个a,1个b和无c组成.我想获得这样的输出(根据级别的元素的频率):

fac <- factor(c("a", "b", "a"), levels=c("a", "b", "c"))
tbl <- table(fac)
tbl

## fac
## a b c 
## 2 1 0
Run Code Online (Sandbox Code Playgroud)

这应该在一个漂亮的html表格中用knitr/kable打印:

library(knitr)
kable(tbl)
Run Code Online (Sandbox Code Playgroud)

但是这里出现了错误:

"Error in dn[[2L]] : subscript out of bounds".
Run Code Online (Sandbox Code Playgroud)

我假设表的dimnames存在问题:

attributes(tbl)
## $dim
## [1] 3
## 
## $dimnames
## $dimnames$fac
## [1] "a" "b" "c"
## 
## 
## $class
## [1] "table"
Run Code Online (Sandbox Code Playgroud)

有没有选择"修复"kable的dimnames?我只是想打印这个"简单"的表 - 也许我被困在一些简单的东西?

这里描述了使用"表格"的因素:http://www.stat.berkeley.edu/~s133/factors.html

最近几天我读了很多关于'pander'包的内容.如果我用平移器打印表,它可以工作.为什么?我应该切换到迎合?

pander(tbl)
Run Code Online (Sandbox Code Playgroud)

r knitr r-markdown pander

4
推荐指数
1
解决办法
3736
查看次数

标签 统计

django ×1

django-models ×1

django-signals ×1

knitr ×1

pander ×1

r ×1

r-markdown ×1