Python Django模型:创建模型条目的变体,并与原始条目进行比较
我正在尝试构建一个Django应用程序,允许用户对网站进行爬网,收集所述网站的所有内部链接,然后用户可以在此列表上创建许多变体,并对这些链接进行更改,以模拟不同的网站架构(例如,删除一些链接,添加链接等)。我需要保留原始链接列表,然后能够将其与每个变体进行比较,以显示差异(即+50%已删除链接,-10%页脚链接,等等) 我不确定在这种情况下理想的模型结构是什么。我已经创建了模型来保存用户进行的每次爬网,并创建了模型来存储爬网链接: models.pyPython Django模型:创建模型条目的变体,并与原始条目进行比较,python,django,django-models,Python,Django,Django Models,我正在尝试构建一个Django应用程序,允许用户对网站进行爬网,收集所述网站的所有内部链接,然后用户可以在此列表上创建许多变体,并对这些链接进行更改,以模拟不同的网站架构(例如,删除一些链接,添加链接等)。我需要保留原始链接列表,然后能够将其与每个变体进行比较,以显示差异(即+50%已删除链接,-10%页脚链接,等等) 我不确定在这种情况下理想的模型结构是什么。我已经创建了模型来保存用户进行的每次爬网,并创建了模型来存储爬网链接: models.py # Django from django.d
# Django
from django.db import models
from django.urls import reverse
from django.utils.timezone import now
# Owner
from apps.project.models import Project, Experiment
CRAWL_STATUS = {(1, "Running"), (2, "Paused"), (3, "Finished")}
# Custom model managers
class CrawlManager(models.Manager):
def new_crawl(self, exp_id, status):
# get experiment instance
experiment = Experiment.objects.get(id=exp_id)
# save new crawl in DB
crawl = self.create(experiment=experiment, status=status)
return crawl
class CrawledLinksManager(models.Manager):
def new_link(self, crawl, source_url, target_url, nofollow):
link = self.create(
crawl=crawl, source_url=source_url, target_url=target_url, nofollow=nofollow
)
return link
# Models
class CrawlSettings(models.Model):
experiment = models.OneToOneField(Experiment, on_delete=models.CASCADE)
start_url = models.URLField()
respect_robots = models.BooleanField(default=True)
url_limit = models.IntegerField(null=True, blank=True)
def get_absolute_url(self):
return reverse("experiment_list", kwargs={"pk": self.experiment.project.id})
class Crawl(models.Model):
experiment = models.OneToOneField(Experiment, on_delete=models.CASCADE, related_name="related_crawl")
crawl_started = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=CRAWL_STATUS)
objects = CrawlManager()
def __str__(self):
return str(self.pk)
class CrawledLinks(models.Model):
crawl = models.ForeignKey(Crawl, on_delete=models.CASCADE)
source_url = models.URLField()
target_url = models.URLField()
nofollow = models.BooleanField()
objects = CrawledLinksManager()
现在我最大的问题是,如何管理链接中的变体/更改?我想为每个变体复制爬网链接条目,但我想这会影响性能/不理想
你对我如何管理这个用例有什么建议吗?如何在初始链接列表中存储变体,然后将此变体与原始变体进行比较