- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里有几个关于向后关系的问题,但我要么太笨而无法理解它们,要么认为它们不适合我的情况。
我有模型
class MyModel(models.Model)
stuff = models.ManyToManyField('self', related_name = 'combined+')
我创建了表单,将存储的信息组合起来。它在数据库中存储对象关系,如下所示:
表:
id:from_stuff_id:to_stuff_id
1:original_object_id:first_related_object
2:original_object_id:second_related_object
3:first_related_object:original_object_id
4:second_related_object:original_object_id
因此,当我显示对象first_lated_object并检查与
的关系时myobject.stuff.all()
然后我得到“original_object”。但我不需要它。我希望它不会显示出这样的向后关系。
编辑1
所以我很难解释自己。
也许这段代码能更好地说明我想要的。
myobjectone = MyModel.objects.get(pk = 1)
myobjecttwo = MyModel.objects.get(pk = 2)
myobjectthree = MyModel.objects.get(pk = 3)
myobjectone.stuff.add(myobjecttwo)
myobjectone.stuff.add(myobjectthree)
myobjectone.stuff.all()
[myobjecttwo, myobjectthree] <-- this i want
myobjecttwo.stuff.all()
[myobjectone]<-- this i do not want
myobjectthree.stuff.all()
[myobjectone]<-- this i do not want
现在唯一的问题是 - 如果我不想要它们产生的结果,我是否应该使用 stuff.all() 并且应该编写我自己的管理器/方法来获取排除向后关系的对象列表。
/编辑1
编辑2回应亨利·弗洛伦斯:
好吧 - 我确实用空基测试了它,看起来对称 = False 确实存在数据库级别差异。我认为。
我使用对称 = False 创建了空表,然后创建添加关系并没有产生向后关系。如果我创建了没有对称的空表= False。然后他们就是了。创建表后,设置对称 = False 没有任何区别。所以我猜差异在于数据库级别。
/编辑2那么我应该在这里做什么?
写我自己的经理还是什么?
艾伦
最佳答案
我对这个问题的理解是,多对多关系应该是一种方式,如果以下情况为真:
-------------- ----------------
| mymodelone |---------->| mymodeltwo |
-------------- | ----------------
|
| ----------------
----->| mymodelthree |
----------------
那么另一个方向上不应该存在隐式关系:
-------------- ----------------
| mymodelone |<-----/----| mymodeltwo |
-------------- ----------------
-------------- ----------------
| mymodelone |<-----/----| mymodelthree |
-------------- ----------------
ManyToMany
字段具有 symmetry
属性,默认情况下为 True
,请参阅:here .
要创建一个新应用来演示非对称 ManyToMany 字段:
创建一个新应用:
$ python ./manage.py startapp stuff
在settings.py
中添加东西应用程序:
...
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'stuff'
)
....
编辑`stuff/models.py:
from django.db import models
class MyModel(models.Model):
stuff = models.ManyToManyField('self', related_name = 'combined+', symmetrical=False, blank = True, null = True, verbose_name = "description")
def __unicode__(self):
return "MyModel%i" % self.id
同步数据库:
$ python ./manage.py syncdb
Creating tables ...
Creating table stuff_mymodel_stuff
Creating table stuff_mymodel
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
然后在django shell中测试:
$ python ./manage.py shell
>>> from stuff.models import MyModel
>>> MyModel().save()
>>> MyModel().save()
>>> MyModel().save()
>>> MyModel.objects.all()
[<MyModel: MyModel1>, <MyModel: MyModel2>, <MyModel: MyModel3>]
>>> m1 = MyModel.objects.get(pk=1)
>>> m2 = MyModel.objects.get(pk=2)
>>> m3 = MyModel.objects.get(pk=3)
>>> m1.stuff.all()
[]
>>> m1.stuff.add(m2)
>>> m1.stuff.add(m3)
>>> m1.stuff.all()
[<MyModel: MyModel2>, <MyModel: MyModel3>]
>>> m2.stuff.all()
[]
>>> m3.stuff.all()
[]
>>>
编辑 - 现有模型上的多对多关系
ManyToManyField 的对称性是在将模型写入数据库时创建的,而不是在读取模型时创建的。如果我们将模型更改为:
from django.db import models
class MyModel(models.Model):
stuff = models.ManyToManyField('self', related_name = 'combined+')
def __unicode__(self):
return "MyModel%i" % self.id
创建新的MyModel
实例:
>>> MyModel().save()
>>> MyModel().save()
>>> MyModel.objects.all()
[<MyModel: MyModel1>, <MyModel: MyModel2>, <MyModel: MyModel3>, <MyModel: MyModel4>, <MyModel: MyModel5>]
>>> m4 = MyModel.objects.get(pk=4)
>>> m5 = MyModel.objects.get(pk=5)
>>> m4.stuff.add(m5)
>>> m4.stuff.all()
[<MyModel: MyModel5>]
>>> m5.stuff.all()
[<MyModel: MyModel4>]
正如预期的那样,ManyToManyField 正在创建对称关系。如果我们随后将 ManyToManyField
设置为 symmetry = False
:
>>> from stuff.models import MyModel
>>> MyModel().save()
>>> MyModel().save()
>>> MyModel.objects.all()
[<MyModel: MyModel1>, <MyModel: MyModel2>, <MyModel: MyModel3>, <MyModel: MyModel4>, <MyModel: MyModel5>, <MyModel: MyModel6>, <MyModel: MyModel7>]
>>> m6 = MyModel.objects.get(pk=6)
>>> m7 = MyModel.objects.get(pk=7)
>>> m6.stuff.all()
[]
>>> m7.stuff.all()
[]
>>> m6.stuff.add(m7)
>>> m6.stuff.all()
[<MyModel: MyModel7>]
>>> m7.stuff.all()
[]
>>> m5 = MyModel.objects.get(pk=5)
>>> m4 = MyModel.objects.get(pk=4)
>>> m4.stuff.all()
[<MyModel: MyModel5>]
>>> m5.stuff.all()
[<MyModel: MyModel4>]
可以看出,m6
和 m7
之间的新 ManyToMany
关系并不对称,而 m4 之间现有的关系则不对称。
和 m5
仍然是对称的,正如创建这些对象时所声明的模型一样。
编辑 - 使用对称外键的附加数据库约束
对于这个答案的长度向读者表示歉意,我们似乎正在深入探讨这个问题。
在 SQL 中,多对多关系是通过创建一个表来建模的,该表保存该关系特有的所有信息 - 通常只是两个表的主键值。
因此,对于我们的 MyModel
,django 创建了两个表:
----------------- -----------------------
| stuff_mymodel |---------->| stuff_mymodel_stuff |
----------------- -----------------------
^ |
| |
--------------------------------
图中显示的链接由架构中的主键或 id 值表示:
mysql> describe stuff_mymodel;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)
mysql> describe stuff_mymodel_stuff;
+-----------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| from_mymodel_id | int(11) | NO | MUL | NULL | |
| to_mymodel_id | int(11) | NO | MUL | NULL | |
+-----------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
并显示为 Django manage.py
脚本的输出:
$ python ./manage.py sql stuff
BEGIN;
CREATE TABLE `stuff_mymodel_stuff` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`from_mymodel_id` integer NOT NULL,
`to_mymodel_id` integer NOT NULL,
UNIQUE (`from_mymodel_id`, `to_mymodel_id`)
)
;
CREATE TABLE `stuff_mymodel` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
)
;
ALTER TABLE `stuff_mymodel_stuff` ADD CONSTRAINT `from_mymodel_id_refs_id_7fa00238` FOREIGN KEY (`from_mymodel_id`) REFERENCES `stuff_mymodel` (`id`);
ALTER TABLE `stuff_mymodel_stuff` ADD CONSTRAINT `to_mymodel_id_refs_id_7fa00238` FOREIGN KEY (`to_mymodel_id`) REFERENCES `stuff_mymodel` (`id`);
COMMIT;
无论 django ManyToManyField
是否对称,此 sql 都是相同的。唯一的区别是在 stuff_mymodel_stuff
表中创建的行数:
mysql> select * from stuff_mymodel_stuff;
+----+-----------------+---------------+
| id | from_mymodel_id | to_mymodel_id |
+----+-----------------+---------------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 4 | 5 |
| 4 | 5 | 4 |
| 5 | 6 | 7 |
+----+-----------------+---------------+
5 rows in set (0.00 sec)
链接m4 -> m5
是对称的,而其他链接则不是。深入研究 Django 源代码,我们可以找到负责在 sql 中创建“镜像”条目的代码,如果 symmetry
为 True
:
# If the ManyToMany relation has an intermediary model,
# the add and remove methods do not exist.
if rel.through._meta.auto_created:
def add(self, *objs):
self._add_items(self.source_field_name, self.target_field_name, *objs)
# If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table
if self.symmetrical:
self._add_items(self.target_field_name, self.source_field_name, *objs)
add.alters_data = True
目前这是 github 上的第 605 行:https://github.com/django/django/blob/master/django/db/models/fields/related.py
希望这能解答您的所有疑问。
关于Django ManyToMany 与 'self' 的关系没有向后关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19837728/
我想在 iOS 设备上以慢动作显示视频。 我的 View 包含一个视频(约 2 秒长)和一个 slider 。 用户可以移动 slider 并逐帧(向前和向后)浏览电影。 MPMoviePlayerC
假设两个模型的标准外键,例如: Company(models.Model): name = models.CharField('Nome', max_length = 255) ...
即使从其他项目复制和粘贴代码,我的 NSURL 也会向后格式化,这毫无意义。 例如: let baseURL = NSURL(string: "http://example.com/v1/") NSU
我目前有: $i = 1; while { echo $i; $i++; } 它显示: 1234 etc.. 如何让它向后显示? 例如 4321 etc.. 我基本上想做完全相同的事情,但将其
我正在使用 JQuery 选择页面上的一些元素,然后在 DOM 中移动它们。我遇到的问题是我需要以 JQuery 自然想要选择它们的相反顺序选择所有元素。例如: Item 1 Item
有 Home.vue 和 Statistics.vue 页面。 Home.vue 渲染 TableFields.vue 组件。在 Home.vue 中,有一些字段编号,在页面加载时设置了初始值“3”。
我正在寻找类似 https 的东西,但是是反向的。用户(提前)生成自己的私钥,然后(仅在稍后)向 Web 应用程序提供关联的公钥。这部分交换应该(如果需要)在带外进行。然后使用这些 key 对通信进行
我不知道如何解释我的问题。这是我尝试解释的:函数 FindNext(SearchRec) 将从目录中获取下一个文件。在我的应用程序中,我有时会从当前的 SearchRec 索引向后查找一些文件。那么我
我有一个带前导 NA 的日期向量,我想使用包 zoo 中的 na.approx 为这些 NA 生成一个近似序列。 na.approx 不适用于前导 NA: x <- as.Date(c(rep(NA,
在任何网络浏览器、Windows 文件管理器和许多其他应用程序中,都支持向前和向后导航。默认情况下,这始终(或至少在大多数情况下)适用于额外的鼠标按钮,如果您的鼠标有的话。 我想在基于 WinAPI
我正在尝试使用双向链表编写撤消和重做函数,该双向链表在调用 doAction() 时在 list_1 前面添加操作(节点),在调用 undo() 时将操作存储在 list_2 中,并在调用 redo(
我有一个示例数据框,如下所示 ID count 1 10 2 20 3 40 所以对于累计计数,我要实现 ID count
我的应用程序需要显示一个值的图形表示,范围从 -1 到 1。负值应使用一种颜色,正值应使用另一种颜色。零位于中心,什么也没有显示。 (如果有帮助的话,这里的特殊用途是在金融应用程序中显示买卖订单的相对
我对这个简单的线条动画有点吃力。我想出了如何暂停它,但我需要的是能够从我调用函数 resetAnimation() 的那一刻起将动画反转回起点。 let pathAnimation = CABasic
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to read a file from bottom to top in Ruby? 在开发我的 R
import numpy as np data = np.array([0, 0, 0, 0, 0, 0, 0, 1], dtype=np.uint8) data.view(np.uint64) 我期
我有一个这样的值列表, lst = [1, 2, 3, 4, 5, 6, 7, 8] 期望输出 : window size = 3 1 # first element in the list
我的代码再简单不过了... if (iWant > thereAre){ msg = "There's only "+thereAre+" left, but you want "+iWant
#include #include /* converts to binary */ int main() { unsigned int decimalNUM = 0; print
CTRL-x o - switch cursor to other window 我想有能力扭转 control-x o做。像 control-x p这正是 control-x o有,但倒退。这个请求
我是一名优秀的程序员,十分优秀!