我正在尝试使用 github 上的教程在 python 和 django 1.10 中编写一个 Twitter 克隆。但是我已经通过了一些 ModelManager 类,我无法理解逻辑,尤其是在第一个 if 语句中。
class TweetManager(models.Manager):
def retweet(self, user, parent_obj):
if parent_obj.parent:
og_parent = parent_obj.parent
else:
og_parent = parent_obj
obj = self.model(
parent = og_parent,
user = user,
content = parent_obj.content,
)
obj.save()
return obj
class Tweet(models.Model):
parent = models.ForeignKey("self", blank=True, null=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
content = models.CharField(max_length=140, validators= [validate_content])
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = TweetManager()
请您参考如下方法:
它可以防止创建父级的链。想象一下,您有一条推文 A 并且被转发,推文 B,那么我们不想创建一条推文 C 与:
A <--- B <-x- C
我们希望 B 和 C 都引用原始父级 A,例如:
A <--- B
^
'-- C
因此,如果您想转推 parent_obj 等,它首先会查看它是否是转推。如果是这样,它将获得该推文的父级。如果推文没有父级,我们可以将其用作父级。
如果我们每次都这样做,那么检查一个父级别就足够了,因为一条推文永远不会有“祖 parent ”。
