Django 模型:创建模型条目的变体并与原始模型进行比较

时间:2021-05-21 09:59:04

标签: python django django-models

我正在尝试构建一个 Django 应用程序,该应用程序允许用户抓取网站,收集该网站的所有内部链接,然后用户可以在此列表上创建许多变体并对这些链接进行更改以模拟不同的网站架构(例如,删除一些链接,添加一个链接等)。我需要保留原始链接列表,然后能够将其与每个变体进行比较以显示差异(即 +50% 删除的链接,页脚中的 -10% 链接等)

我不确定在这种情况下理想的模型结构是什么。我已经创建了模型来保存用户所做的每次抓取,以及模型来存储抓取的链接:

models.py

# 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()

现在对我来说最大的问题是,如何管理链接中的变体/更改?我想为每个变体复制抓取的链接条目,但我想这会影响性能/并不理想。

你对我如何管理这个用例有什么建议吗?如何在初始链接列表中存储变体,然后将此变体与原始链接进行比较?

0 个答案:

没有答案
相关问题