Γιατί δεν RelatedManager.add () δέχονται ένα iterable ως επιχείρημα;

ψήφοι
1

Αυτή η ερώτηση είναι περίπου RelatedManager.add () η οποία χρησιμοποιείται για την προσθήκη περιπτώσεις μοντέλου αντικειμένου σε ένα πολλών-προς-ένα ή πολλά-προς-πολλά σχέση. Για να φανεί η ερώτησή μου, ας πούμε έχω τις εξής δύο μοντέλα:

class Book(models.Model):
    title = models.CharField()

class Author(models.Model):
    name = models.CharField()
    books = models.ManyToManyField(Book)

Τώρα, για κάθε Authorέχω μια λίστα με Bookτα αντικείμενα που θέλετε να προσθέσετε στη σχέση. Αυτή τη στιγμή, το κάνω κάπως έτσι:

book_objects = [
    <Book: Harry Potter and the Philosopher's Stone>, 
    <Book: Harry Potter and the Chamber of Secrets>,
    <Book: Harry Potter and the Prisoner of Azkaban>
]

jk_rowling = Author.objects.get(name='J. K. Rowling')

for book in book_objects:
    jk_rowling.books.add(book)
jk_rowling.save()

Ωστόσο, αυτό δεν είναι πολύ αποτελεσματική όσο έχω να ασχοληθεί με χιλιάδες αντικείμενα για να προστεθεί σε μια σχέση αυτού του είδους και να παίρνει τις ηλικίες. Αντίθετα, η τεκμηρίωση Django συνιστά να καλέσετε add()με περισσότερα από ένα μοντέλο αντικειμένου ως επιχείρημα. Δηλαδή, θα πρέπει να το κάνουμε όπως τα ακόλουθα:

jk_rowling.books.add(book1, book2, book3)

Αλλά δεν μπορώ να το κάνω αυτό γιατί δεν ξέρω τον αριθμό των αντικειμένων προστεθεί στη σχέση των προτέρων. Δεν καταλαβαίνω γιατί δεν μπορώ να κάνω τα εξής:

jk_rowling.books.add(book_objects)

Γιατί δεν add()δέχονται την iterable ως επιχείρημα; Και πώς μπορώ να προσθέσω μια μεγάλη ποσότητα των αντικειμένων σε μια σχέση όπως αυτό πιο αποτελεσματικά από ό, τι ζητούν add()για κάθε αντικείμενο ξεχωριστά; Ευχαριστώ πολύ!

Δημοσιεύθηκε 16/10/2012 στις 22:02
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
4

Μπορείτε να επεκτείνετε ακριβώς σειρά σας varargs:

book_objects = [
    <Book: Harry Potter and the Philosopher's Stone>, 
    <Book: Harry Potter and the Chamber of Secrets>,
    <Book: Harry Potter and the Prisoner of Azkaban>
]

jk_rowling = Author.objects.get(name='J. K. Rowling')

jk_rowling.books.add(*book_objects)   # <---------------

jk_rowling.save()
Απαντήθηκε 16/10/2012 στις 22:27
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more