Django ยังไงเพื่อเรียงลดหลั่นเป็นปรับปรุงผ่านหลายแบบ?

0

คำถาม

ฉันกำลังเขียน Django จากโปรแกรมติดตามข่าวสารของวัตถุ(Objekt)และพวกเขาซ่อมบำรุงรางงาน. Objekts สามารถเป็นเกี่ยวข้องกับตำแหน่งที่อยู่

ตำแหน่ง(0/1)---(n)Objekt(1)---(n)งาน

สถานที่ Objekt และงานทุกคนจะมีสถานะของสนามกับรอยตามค่าต่างๆ:

    RED = "red"
    YELLOW = "yellow"
    GREEN = "green"
    STATUS = [
        (RED, "Overdue tasks"),
        (YELLOW, "Pending tasks"),
        (GREEN, "All good"),
    ]

ฉันต้องการให้ตำแหน่งแผนที่ปากกามาร์คเกอร์เปลี่ยนแปลงสีจากพื้นฐานสถานะของที่เกี่ยวข้องกั Objekts และ ultimatelly งาน.

ฉันจะพยายามตาม django ที่ดีที่สุดที่ฝึก แล้วสร้างอ้วนคุณครูแต่พอกลับมา

from django.db import models
from locationapp.models import Location
from taskapp.models import Task
from rules.contrib.models import RulesModel

class Objekt(RulesModel):
    RED = "red"
    YELLOW = "yellow"
    GREEN = "green"
    STATUS = [
        (RED, "Overdue tasks"),
        (YELLOW, "Pending tasks"),
        (GREEN, "All good"),
    ]
    name = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    location = models.ForeignKey(
        Location, on_delete=models.SET_NULL, null=True, blank=True
    )
    status = models.CharField(max_length=6, choices=STATUS, default=GREEN)

    def set_status(self):
        if Task.objects.filter(objekt=self.id).filter(status=Task.RED).exists():
            self.status = Objekt.RED
        elif Task.objects.filter(objekt=self.id).filter(status=Task.YELLOW).exists():
            self.status = Objekt.YELLOW
        else:
            self.status = Objekt.GREEN

แต่ยังไงก็ตามฉันไม่ค่อยแน่ใจเกี่ยวกับเรื่องของฉันสงครามแย่งชิงยุทธศาสยู่ที่นี่ได้ยังไงความคืบหน้าเรื่องงานกระตุ้นความคืบหน้าเรื่องเกี่ยวข้องกั Objekt. แล้วจะ Objekt ต่อไปกระตุ้นที่ปรับปรุงอยู่ที่ตำแหน่งถ้าต้องการที่ทั้งหมดเหรอ?

django model python
2021-11-22 21:49:18
1

คำตอบที่ดีที่สุด

1

มีศักยภาพทางออกคือต้องใช้สัญญาณคุณ ฉันติดตั้งเพื่อใช้งานมันเป็นตามโดยไม่ขึ้นฉ่ายสำหรับตอนนี้:

# objektapp/apps.py
from django.apps import AppConfig


class ObjektappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'objektapp'

    def ready(self):
        import objektapp.signals
# objektapp/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db import transaction
from taskapp.models import Task
from objektapp.models import Objekt

@receiver(post_save, sender=Task)
def set_status(sender, instance, created, **kwargs):
    # TODO: Use celery for async operation: https://docs.djangoproject.com/en/3.2/topics/db/transactions/
    transaction.on_commit(lambda: objekt_update_status(instance))

def objekt_update_status(task_instance):
    objekt = Objekt.objects.get(id=task_instance.objekt.id)

    new_objekt_status = Objekt.GREEN
    if Task.objects.filter(objekt=task_instance.objekt.id, status=Task.RED).exists():
        new_objekt_status = Objekt.RED
    elif Task.objects.filter(objekt=task_instance.objekt.id, status=Task.YELLOW).exists():
        new_objekt_status = Objekt.YELLOW

    if objekt.status != new_objekt_status:
        objekt.status = new_objekt_status
        objekt.save()

คล้ายกันจัดฉากฉันเคยทำบนตำแหน่งตัวอย่างซึ่งก็มีปฏิกิริยาตอบ post_save สัญญาณจาก Objekt. ฉันไม่แน่ใจว่ามันคือที่ดีที่สุดเพื่อใช้เป็นที่เก็บ objekt_update_status ฟังก์ชัน()จะอยู่ใน signals.py แฟ้มแต่พยายามจะใส่มันเข้าไปใน models.py ลงเอยกับวงกลมนำเข้าข้อผิดพลาด

2021-11-24 11:19:32

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................