Создание или обновление связанного объекта модели с помощью команды управления Django

Мне нужно периодически проверять состояние списка урлов и сообщать об их состоянии. Я создал 2 модели, одна из которых содержит список основных урлов, а другая - все подссылки на страницах основного урла.

Модель 1

class Site(CreationModificationDateBase, SoftDeletionModel):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=250, unique=True)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
    url = models.URLField(unique=True)
    status_code = models.CharField(max_length=3, blank=True, default="")
    status_message = models.CharField(max_length=255, blank=True, default="")

    def __str__(self):
        return f'{self.name}'

Модель 2

class Link(CreationModificationDateBase, SoftDeletionModel):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    site = models.ForeignKey(Site, on_delete=models.DO_NOTHING, blank=True, null=True)
    url = models.CharField(blank=True, max_length=250, default="")
    status_code = models.CharField('Site Status', max_length=3, blank=True, default="")
    status_message = models.CharField(max_length=255, blank=True, default="")

    def __str__(self):
        return f'{self.url}'

    class Meta:
        ordering = ('url',)
        verbose_name = "link"
        verbose_name_plural = "links"

У меня есть метод на Model1, который возвращает код состояния и сообщение из ListView при загрузке.

    def get_links(self):
        data = requests.get(self.url).text
        soup = BeautifulSoup(data, features="html.parser")
        anchors = soup.find_all("a")

        links = []
        links_status = []
        for link in anchors:
            link_href = link.get("href")
            if f"https" in link_href:
                links.append(link_href)
            elif f"http" in link_href:
                links.append(link_href)
            elif f"/" in link_href and len(link_href) > 1 and self.url not in link_href:
                links.append(self.url + link_href)

        for ll in links:
            try:
                status_code = requests.head(ll, allow_redirects=True).status_code
                status_reason = requests.head(ll, allow_redirects=True).reason
                links_status.append((ll, status_code, status_reason))
            except requests.exceptions.ConnectionError as e:
                links_status.append((ll, 999, e))

        return links_status

Я могу сохранить код состояния и сообщение в базу данных с помощью этой команды управления.

class Command(BaseCommand):
    help = (
        "Updates the status code and message of each site"
    )

    def handle(self, *args, **options):
        qs = Site.objects.all()
        for site in qs:
            try:
                sc = requests.head(site.url, allow_redirects=True).status_code
                sr = requests.head(site.url, allow_redirects=True).reason
                print(site.url, sc, sr)
            except requests.exceptions.ConnectionError:
                sc = 999
                sr = "Connection Error"
            site.status_code = sc
            site.status_message = sr
            site.save()

Я хочу знать, как я могу сохранить ссылки на страницы, которые я отбраковал с помощью beatifulsoup, в базу данных и сообщить об их состоянии, а также сделать так, чтобы эта команда выполнялась автоматически каждую неделю.

Вернуться на верх