복붙노트

[PYTHON] 어떻게 장고에서 manytomany 필드를 업데이 트하려면?

PYTHON

어떻게 장고에서 manytomany 필드를 업데이 트하려면?

다음은 그 예입니다.

이 수업이 있으면

class Author(models.Model):
    name = models.CharField(max_length=45)

class Book(models.Model):
    name = models.CharField(max_length=45)
    authors = models.ManyToManyField(Author)

데이터베이스에는 "George"라는 이름을 가진 한 명의 저자와 "Georfe"라는 이름을 가진 저자가 있습니다. 마지막 하나는 실수입니다. 그래서 내가 원하는 것은 "조지"라는 저자가 "Georfe"를 가지고있는 모든 책에서 저자가 "George"로 대체 한 것입니다.

SQL에서는 정말 쉽습니다. id가 "George"= 3이고 id가 "Georfe"= 7이고 관계 테이블 이름이 "author_book"인 경우 :

UPDATE author_book SET id=3 WHERE id=7;

그것 장고 ORM으로 할 수 있습니까?

나는 그것을 할 수있는 방법을 찾았습니다. 나는 잘못 입력 된 저자의 모든 관련 서적을 반복하고 다음을 수행합니다.

book.authors.add(Author.objects.get(id=3))
book.authors.remove(Author.objects.get(id=7))

그러나 나는이 솔루션이 정말로 우아하고 효율적이지 못하다는 것을 발견하지 못했다. 루프가없는 해결책이 있습니까?

해결법

  1. ==============================

    1.참고 :이 코드는 잘못된 '조지'작성자를 삭제하고 올바른 작성자를 가리 키도록 책을 업데이트합니다. 그렇게하고 싶지 않다면 .remove ()를 @jcdyer의 답변으로 사용하십시오.

    참고 :이 코드는 잘못된 '조지'작성자를 삭제하고 올바른 작성자를 가리 키도록 책을 업데이트합니다. 그렇게하고 싶지 않다면 .remove ()를 @jcdyer의 답변으로 사용하십시오.

    이럴 수 있니?

    george_author = Author.objects.get(name="George")
    for book in Book.objects.filter(authors__name="Georfe"):
        book.authors.add(george_author.id)
        book.authors.filter(name="Georfe").delete()
    

    두 모델 ( "through"키워드 arg)을 사용하여 명시 적 테이블을 조인 할 경우 이것이 더 쉬울 것이라고 생각합니다.이 경우 관계 테이블에 직접 액세스 할 수 있고 .update ( id = george_author.id).

  2. ==============================

    2.자동 생성 테이블을 사용하면 2 단계 삽입 및 삭제를 수행 할 수 있습니다. 이는 가독성을 높이는 데 유용합니다.

    자동 생성 테이블을 사용하면 2 단계 삽입 및 삭제를 수행 할 수 있습니다. 이는 가독성을 높이는 데 유용합니다.

    george = Author.objects.get(name='George')
    georfe = Author.objects.get(name='Georfe')
    
    book.authors.add(george)
    book.authors.remove(georfe)
    assert george in book.authors
    

    명시 적으로 정의 된 테이블 (authors = models.ManyToManyField (Author, through = BookAuthors))을 사용하면 BookAuthor에서 명시 적으로 관계를 변경할 수 있습니다.이 모델은 이미 존재하며, 자동으로 django에 의해 생성됩니다. 저장하려는 추가 데이터가있는 경우에만 명시 적 모델을 작성해야합니다 (예 : 특정 저자가 작성한 장이 다중 작성자 책에 있음).

    # This line is only needed without a custom through model.
    BookAuthor = Book.authors.through
    book_author = BookAuthor.objects.get(author=georfe, book=great_american_novel)
    book_author.author = george
    book_author.save()
    assert george in book.authors
    
  3. ==============================

    3.django> = 1.11 문서 :

    django> = 1.11 문서 :

    >>> b = Blog.objects.get(id=1)
    >>> e = Entry.objects.get(id=234)
    >>> b.entry_set.add(e) # Associates Entry e with Blog b.
    >>> new_list = [obj1, obj2, obj3]
    >>> e.related_set.set(new_list)
    

    이 메서드는 작업 수행 방법을 제어하는 ​​명확한 인수를받습니다. False (기본값)이면 remove ()를 사용하여 새 세트에서 누락 된 요소가 제거되고 새 세트 만 추가됩니다. clear = True이면 clear () 메서드가 대신 호출되며 전체 집합이 한 번에 추가됩니다.

    및 참조 : django에서. m2d 필드를 업데이트하는 방법

  4. from https://stackoverflow.com/questions/1194737/how-to-update-manytomany-field-in-django by cc-by-sa and MIT license