In dealing with nested relationship, if we want to maintain two or more instances of one to one relationship is created, we can write a custom manager class.
Custom manager class is primarily used in two cases:
- 1. modify the original query set, override all () method
- 2. A method to add additional class manager, such as inserting data into the database.
Management prepared as follows:
from django.db.models.manager import Manager class TrackManager(Manager): def create_track(self, validated_data): from models import Track from models import Album album_data = validated_data.pop('album') album = Album.objects.create(**album_data) validated_data['album'] = album track = Track.objects.create(**validated_data) return track def get_queryset(self): return Manager.get_queryset(self).filter(is_deleted=False)
Note: The model must be introduced in the method, the introduction of the head to be wrong.
Use management classes
1, the reference introduced model.py
class Track(models.Model): album = models.ForeignKey(Album, related_name='tracks') order = models.IntegerField() title = models.CharField(max_length=100) duration = models.IntegerField() is_deleted = models.BooleanField(default=False) creator = models.CharField(max_length=100, null=True) objects = managers.TrackManager() class Meta: db_table = 'track'
2, serializer.py uses:
def create(self, validated_data): track = Track.objects.create_track(validated_data) return track