我的模特就是这样的:
class QuestionTagM2M(models.Model):
tag = models.ForeignKey('Tag')
question = models.ForeignKey('Question')
date_added = models.DateTimeField(auto_now_add=True)
class Tag(models.Model):
description = models.CharField(max_length=100, unique=True)
class Question(models.Model):
tags = models.ManyToManyField(Tag, through=QuestionTagM2M, related_name='questions')
我真正想做的就是在创建一个给定的多人关系时添加一个时间戳。这是有道理的,但也增加了一点复杂性。除了删除.add()功能之外[尽管我真正添加的唯一字段是自动创建的,所以从技术上讲,它不应该再干扰这个功能]。但我可以接受,因为我不介意做额外的QuestionTagM2M.objects.create(question=,tag=)
,如果这意味着获得额外的时间戳功能。我的问题是我真的很想在管理中保留我的filter_horizontal
javascript小部件。我知道文档中说我可以使用内联,但这太难了,因为除了Tag
的外键之外,内联中没有其他字段。另外,在我的数据库模式的更大方案中,我的Question
对象已经在我的管理页面上显示为内联,而且由于Django不支持管理中的嵌套内联,因此我无法为给定的问题选择标记。是否有任何方法可以重写formfield_for_manytomany(self, db_field, request=None, **kwargs)
或类似的内容,以允许我使用漂亮的filter_horizontal
小部件并自动创建数据库的date_added
列?这似乎是django本机应该能够做的事情,只要您指定中间层中的所有列都是自动创建的(除了外键),可能是使用auto_created=True
?或者类似的东西
来自https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-intermediary-models
但是,您可以尝试通过在管理中使用
fields = ('tags',)
显式地包含标记字段。这将导致此验证异常此验证在https://github.com/django/django/blob/master/django/contrib/admin/validation.py#L256中实现
我不认为你可以绕过这个验证,除非你实现你自己的自定义域作为ManyToManyField使用。
有很多方法可以做到这一点
QuestionTagM2M._meta.auto_created = True
,并处理w/syncdb事务。在models.py中将
date_added
字段动态添加到Question
模型的M2M模型然后你可以在管理中正常使用它
ManyToManyField
。在Python shell中,使用
Question.tags.through
来引用M2M模型。注意,如果不使用
South
,那么syncdb
就足够了;如果使用,South
就不喜欢 这样就不会冻结date_added
字段,您需要手动编写迁移来添加/删除相应的列。自定义模型管理:
fields
,只定义filter_horizontal
。这将绕过Irfan的答案中提到的字段验证。formfield_for_dbfield()
或formfield_for_manytomany()
,使Django admin对tags
字段使用widgets.FilteredSelectMultiple
。save_related()
方法,如ReverseManyRelatedObjectsDescriptor
字段描述符的__set__()
,以便date_added
在不引发异常的情况下保存M2M实例。自上一个答案发布后,文档可能已更改。我看了一下@Irfan提到的django docs链接,它看起来比以前更加直截了当。
将内联类添加到
admin.py
,并将模型设置为M2M模型在管理类中将
inlines
设置为包含刚才定义的内联别忘了注册这个管理类
完成上述操作后,当我单击一个问题时,我有一个表单来对其进行所有常规编辑,下面是m2m关系中的元素列表,我可以在其中添加条目或编辑现有条目。
相关问题 更多 >
编程相关推荐