Django: कैसे करने के लिए झरना के माध्यम से एक अद्यतन कई मॉडल?

0

सवाल

मैं लिख रहा हूँ एक Django के आधार करने के लिए आवेदन का ट्रैक रखने के लिए वस्तुओं (वस्तु का) और उनके रखरखाव कार्यों. Objekts कर सकते हैं जोड़ा जा करने के लिए एक स्थान है ।

स्थान (0/1) --- (n) वस्तु (1) --- (n) कार्य

स्थान, वस्तु और कार्य के सभी एक की स्थिति के साथ क्षेत्र निम्न मान है:

    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

लेकिन किसी तरह मैं यकीन नहीं कर रहा हूँ के बारे में मेरी अवधारणा यहाँ... कैसे कर सकते हैं पर एक अद्यतन कार्य ट्रिगर पर एक अद्यतन संबंधित वस्तु. और कैसे होगा वस्तु आगे अद्यतन ट्रिगर स्थान पर - यदि आवश्यक सब पर?

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_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ý
..................................................................................................................