Wie kann ich bereits zugewiesene Objekte in einem Django -Queryset effizient ausschließen?Python

Python-Programme
Anonymous
 Wie kann ich bereits zugewiesene Objekte in einem Django -Queryset effizient ausschließen?

Post by Anonymous »

Ich arbeite an einem Django -Projekt, bei dem ich Objekte basierend auf ihrem Status filtern muss, während diejenigen, die bereits in einem anderen Modell zugewiesen sind

Code: Select all

CartObject
- speichert alle Objekte.
[*]

Code: Select all

OnGoingProcess
- verfolgt Objekte, die derzeit zugewiesen werden. zugewiesen in laufender Prozess [/b].

Code: Select all

class CartObject(models.Model):
object_id = models.CharField(max_length=100, unique=True)
status = models.CharField(max_length=50, choices=[("pending", "Pending")])
# Other fields...

class OnGoingProcess(models.Model):
user = models.OneToOneField(DeliveryProfile, on_delete=models.CASCADE, related_name="ongoing_process")
associated_object = models.OneToOneField(CartObject, on_delete=models.CASCADE, related_name="associated_process", blank=True, null=True)
# Other fields...
< /code>

 [b] Aktueller Ansichtscode: < /strong> < /h3>
@user_passes_test(lambda user: user.is_staff)
def process_manager_view(request):
# Get objects that are already assigned in OnGoingProcess
assigned_objects = OnGoingProcess.objects.values_list('associated_object', flat=True)

# Exclude objects that are already assigned
available_objects = CartObject.objects.filter(status="pending").exclude(id__in=assigned_objects).order_by("-id")

context = {
"available_objects": available_objects,
}
return render(request, "useradmin/available-objects.html", context)
< /code>

  Problem: < /strong> < /h3>

 Ich verwende VALUTE_LIST ('adociated_object', flat = true) < /code>, um die zugewiesenen Objekt -IDs zu extrahieren. Diese Objekte.
  Ist dies der effizienteste Weg? />   Alternative Lösungen Ich überlegte: [/b] 
[h4] [b] Option 1: Verwendung von isnull = false 
[/b] [/h4]

Code: Select all

available_objects = CartObject.objects.filter(status="pending").exclude(associated_process__isnull=False)
Profis: Einfach, vermeidet zusätzliche Abfragen.

Code: Select all

from django.db.models import Subquery

assigned_objects = OnGoingProcess.objects.values('associated_object')
available_objects = CartObject.objects.filter(status="pending").exclude(id__in=Subquery(assigned_objects))
Profis: für große Datensätze optimiert.

Code: Select all

from django.db import connection

with connection.cursor() as cursor:
cursor.execute("""
SELECT id FROM useradmin_cartobject
WHERE status='pending'
AND id NOT IN (SELECT associated_object FROM useradmin_ongoingprocess)
ORDER BY id DESC
""")
result = cursor.fetchall()

available_objects = CartObject.objects.filter(id__in=[row[0] for row in result])
< /code>
[b] Profis: < /strong> Leistungsschub für riesige Daten. Ansatz zum Filterobjekten, während diejenigen ausgeschlossen werden, die bereits zugewiesen sind?

würde values_list()
[/b],

Code: Select all

isnull=False
[/b] oder

Code: Select all

Subquery()
[/b] Seien Sie die empfohlene Art und Weise?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post