2012-04-28 29 views
19

Tôi có một câu hỏi liên quan đến mô hình sau. Tôi muốn điền số ManyToManyField từ views.py thay vì thực hiện nó từ Quản trị viên.Django: Làm thế nào để lưu dữ liệu vào ManyToManyField?

Nhưng làm cách nào để thêm dữ liệu vào trường genresManyToManyField?

views.py

content = Movie_Info(id = m_id, 
        title = data[0].get('title'), 
        overview = data[0].get('overview'), 
        release_date = data[0].get('release_date'), 
       ) 
content.save() 

models.py

class Movie_Info_genre(models.Model): 
    genre = models.CharField(max_length=100) 

class Movie_Info(models.Model): 
    id    = models.IntegerField(primary_key=True) 
    title   = models.CharField(max_length=100, blank=True, null=True) 
    overview  = models.TextField(blank=True, null=True) 
    release_date = models.CharField(max_length=10, blank=True, null=True) 
    genres   = models.ManyToManyField(Movie_Info_genre) 
+3

Tư vấn kiểu không liên quan: bằng Python/Django, nó được ưu tiên đặt tên lớp 'MovieInfo' hoặc' MovieInfoGenre' (hoặc chỉ 'MovieGenre' hoặc thậm chí' Genre') thay vì sử dụng dấu gạch dưới ở đó. Ngoài ra, đây có thể là một vấn đề về định dạng SO, nhưng bạn có một số lượng lố bịch vô lý khi tạo 'nội dung'. :) Plus, 'release_date' có thể là' DateField'. – Dougal

+0

@Dougal, cảm ơn lời khuyên. Về thụt đầu dòng, tôi đang sử dụng một plugin cho tôi;) – starcorn

+1

Ngoài ra, không cần trường "id" đặc biệt trong mô hình. Django tự động làm điều đó cho bạn. –

Trả lời

31

Sử dụng add method for related fields:

# using Model.object.create is a shortcut to instantiating, then calling save() 
myMoveInfo = Movie_Info.objects.create(title='foo', overview='bar') 
myMovieGenre = Movie_Info_genre.objects.create(genre='horror') 
myMovieInfo.genres.add(myMoveGenre) 

Không giống như điều chỉnh các lĩnh vực khác, cả hai mô hình phải tồn tại trong databa trước khi làm điều này, vì vậy bạn phải gọi save trước khi thêm mối quan hệ nhiều-nhiều. Kể từ khi thêm ngay lập tức ảnh hưởng đến cơ sở dữ liệu, bạn không cần phải lưu sau đó.

+0

Cảm ơn, tôi cũng có thêm một câu hỏi nữa. Thể loại được cho là duy nhất. Với mã sau nó sẽ tăng lỗi nếu cùng một thể loại được thêm hai lần. Vì vậy, tôi tự hỏi, tôi nên bắt lỗi đó và làm điều gì đó về nó. Hoặc là có một số cách tốt hơn để sắp xếp vấn đề này ra? – starcorn

+0

Thay vào đó hãy sử dụng [Model.object.get_or_create] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create). – Jeff

Các vấn đề liên quan