[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.참고 :이 코드는 잘못된 '조지'작성자를 삭제하고 올바른 작성자를 가리 키도록 책을 업데이트합니다. 그렇게하고 싶지 않다면 .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 단계 삽입 및 삭제를 수행 할 수 있습니다. 이는 가독성을 높이는 데 유용합니다.
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.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 필드를 업데이트하는 방법
from https://stackoverflow.com/questions/1194737/how-to-update-manytomany-field-in-django by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 특수 문자에 대한 문자열을 확인하는 방법? (0) | 2018.11.02 |
---|---|
[PYTHON] 문자열을 부분 문자열로 변환하는 방법이 있습니까? (0) | 2018.11.02 |
[PYTHON] 임포트 텐서 흐름을 실행 한 후 잘못된 명령 (코어 덤프 됨) (0) | 2018.11.02 |
[PYTHON] Python은 선형 보간법을 사용하여 불규칙한 시계열을 정규화합니다. (0) | 2018.11.02 |
[PYTHON] pytest에서 테스트 케이스 실행 순서 (0) | 2018.11.02 |