gpt4 book ai didi

python - 如何在 Django 中使用通用外键嵌套模型?

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:44 25 4
gpt4 key购买 nike

我正在做我的第一个 Django 项目,它不是一个教程,我认为尝试构建一个类似 reddit 的网站将是一次很好的学习经历。所以我有一个链接模型和一个评论模型。 Comment 模型有一个 GenericForeignKey,因为它可以引用链接或另一个 Comment。我希望这些评论能够相互嵌套,但我不知道如何嵌套。大家有什么想法吗?

This is the project这是 models.py:

from django.db import models
from django.utils import timezone
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

# Create your models here.
class Link(models.Model):
title = models.CharField(max_length=140)
url = models.URLField(unique=True)
posted = models.DateTimeField(default=timezone.now)
upvotes = models.IntegerField(default=0)
downvotes = models.IntegerField(default=0)

def score(self):
return self.upvotes - self.downvotes

def __str__(self):
return self.title

class Comment(models.Model):
text = models.TextField()
posted = models.DateTimeField(default=timezone.now)
upvotes = models.IntegerField(default=0)
downvotes = models.IntegerField(default=0)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')

def score(self):
return self.upvotes - self.downvotes

编辑:我写了this test它过去了,这让我相信评论实际上可以嵌套。那么问题是如何让它们嵌套在 View 中?我的 View 文件如下:

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType

from .models import Link, Comment
from .forms import LinkForm, CommentForm

# Create your views here.
def links(request):
links = Link.objects.all().order_by('-posted')
if request.method == 'POST':
if request.user.is_authenticated():
form = LinkForm(data=request.POST,auto_id=True)
if form.is_valid():
form.full_clean()
form.save()
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/accounts/login/?next=/')
else:
form = LinkForm(auto_id=True)
return render(request, 'posts/links.html', {'links': links, 'form': form})

def comments(request, link_id):
link = get_object_or_404(Link, pk=link_id)
comments = Comment.objects.filter(
object_id = link.id,
content_type=ContentType.objects.get_for_model(link)
).order_by('-posted')
if request.method == 'POST':
if request.user.is_authenticated():
form = CommentForm(data=request.POST,auto_id=True)
if form.is_valid():
form.full_clean()
form.save()
return reverse('comments', kwargs={'link_id':link.id})
else:
return HttpResponseRedirect('/accounts/login/?next=/{0}/'.format(link.id))
else:
form = CommentForm(auto_id=True)
return render(request, 'posts/comments.html', {'comments': comments, 'link': link, 'form': form})

最佳答案

我使用django-mptt来处理这个问题。

您只需为评论本身创建一个外键,然后将其余工作留给mptt

你必须做这样的事情:

from mptt.models import TreeForeignKey, MPTTModel

class Comment(MPTTModel):
....
....
parent = TreeForeignKey('self', related_name='children',
blank=True, null=True, db_index=True)

阅读文档@ django-mptt

关于python - 如何在 Django 中使用通用外键嵌套模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com