Update models with on_cascade
This commit is contained in:
parent
7c0b4b9a8f
commit
4d09e75262
|
@ -19,8 +19,8 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
|
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
|
||||||
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('track', models.ForeignKey(related_name='track_favorites', to='music.Track')),
|
('track', models.ForeignKey(related_name='track_favorites', to='music.Track', on_delete=models.CASCADE)),
|
||||||
('user', models.ForeignKey(related_name='track_favorites', to=settings.AUTH_USER_MODEL)),
|
('user', models.ForeignKey(related_name='track_favorites', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-creation_date',),
|
'ordering': ('-creation_date',),
|
||||||
|
|
|
@ -5,8 +5,10 @@ from funkwhale_api.music.models import Track
|
||||||
|
|
||||||
class TrackFavorite(models.Model):
|
class TrackFavorite(models.Model):
|
||||||
creation_date = models.DateTimeField(default=timezone.now)
|
creation_date = models.DateTimeField(default=timezone.now)
|
||||||
user = models.ForeignKey('users.User', related_name='track_favorites')
|
user = models.ForeignKey(
|
||||||
track = models.ForeignKey(Track, related_name='track_favorites')
|
'users.User', related_name='track_favorites', on_delete=models.CASCADE)
|
||||||
|
track = models.ForeignKey(
|
||||||
|
Track, related_name='track_favorites', on_delete=models.CASCADE)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('track', 'user')
|
unique_together = ('track', 'user')
|
||||||
|
|
|
@ -20,8 +20,8 @@ class Migration(migrations.Migration):
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||||
('end_date', models.DateTimeField(null=True, blank=True, default=django.utils.timezone.now)),
|
('end_date', models.DateTimeField(null=True, blank=True, default=django.utils.timezone.now)),
|
||||||
('session_key', models.CharField(null=True, blank=True, max_length=100)),
|
('session_key', models.CharField(null=True, blank=True, max_length=100)),
|
||||||
('track', models.ForeignKey(related_name='listenings', to='music.Track')),
|
('track', models.ForeignKey(related_name='listenings', to='music.Track', on_delete=models.CASCADE)),
|
||||||
('user', models.ForeignKey(blank=True, null=True, related_name='listenings', to=settings.AUTH_USER_MODEL)),
|
('user', models.ForeignKey(blank=True, null=True, related_name='listenings', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-end_date',),
|
'ordering': ('-end_date',),
|
||||||
|
|
|
@ -7,8 +7,14 @@ from funkwhale_api.music.models import Track
|
||||||
|
|
||||||
class Listening(models.Model):
|
class Listening(models.Model):
|
||||||
end_date = models.DateTimeField(default=timezone.now, null=True, blank=True)
|
end_date = models.DateTimeField(default=timezone.now, null=True, blank=True)
|
||||||
track = models.ForeignKey(Track, related_name="listenings")
|
track = models.ForeignKey(
|
||||||
user = models.ForeignKey('users.User', related_name="listenings", null=True, blank=True)
|
Track, related_name="listenings", on_delete=models.CASCADE)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
'users.User',
|
||||||
|
related_name="listenings",
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
session_key = models.CharField(max_length=100, null=True, blank=True)
|
session_key = models.CharField(max_length=100, null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
|
||||||
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('submitted_by', models.ForeignKey(related_name='imports', to=settings.AUTH_USER_MODEL)),
|
('submitted_by', models.ForeignKey(related_name='imports', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
|
@ -54,7 +54,7 @@ class Migration(migrations.Migration):
|
||||||
('source', models.URLField()),
|
('source', models.URLField()),
|
||||||
('mbid', models.UUIDField(editable=False)),
|
('mbid', models.UUIDField(editable=False)),
|
||||||
('status', models.CharField(default='pending', choices=[('pending', 'Pending'), ('finished', 'finished')], max_length=30)),
|
('status', models.CharField(default='pending', choices=[('pending', 'Pending'), ('finished', 'finished')], max_length=30)),
|
||||||
('batch', models.ForeignKey(related_name='jobs', to='music.ImportBatch')),
|
('batch', models.ForeignKey(related_name='jobs', to='music.ImportBatch', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
|
@ -64,8 +64,8 @@ class Migration(migrations.Migration):
|
||||||
('mbid', models.UUIDField(editable=False, blank=True, null=True)),
|
('mbid', models.UUIDField(editable=False, blank=True, null=True)),
|
||||||
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('title', models.CharField(max_length=255)),
|
('title', models.CharField(max_length=255)),
|
||||||
('album', models.ForeignKey(related_name='tracks', blank=True, null=True, to='music.Album')),
|
('album', models.ForeignKey(related_name='tracks', blank=True, null=True, to='music.Album', on_delete=models.CASCADE)),
|
||||||
('artist', models.ForeignKey(related_name='tracks', to='music.Artist')),
|
('artist', models.ForeignKey(related_name='tracks', to='music.Artist', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'abstract': False,
|
'abstract': False,
|
||||||
|
@ -78,12 +78,12 @@ class Migration(migrations.Migration):
|
||||||
('audio_file', models.FileField(upload_to='tracks')),
|
('audio_file', models.FileField(upload_to='tracks')),
|
||||||
('source', models.URLField(blank=True, null=True)),
|
('source', models.URLField(blank=True, null=True)),
|
||||||
('duration', models.IntegerField(blank=True, null=True)),
|
('duration', models.IntegerField(blank=True, null=True)),
|
||||||
('track', models.ForeignKey(related_name='files', to='music.Track')),
|
('track', models.ForeignKey(related_name='files', to='music.Track', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='album',
|
model_name='album',
|
||||||
name='artist',
|
name='artist',
|
||||||
field=models.ForeignKey(related_name='albums', to='music.Artist'),
|
field=models.ForeignKey(related_name='albums', to='music.Artist', on_delete=models.CASCADE),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -39,11 +39,11 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='lyrics',
|
model_name='lyrics',
|
||||||
name='work',
|
name='work',
|
||||||
field=models.ForeignKey(related_name='lyrics', to='music.Work', blank=True, null=True),
|
field=models.ForeignKey(related_name='lyrics', to='music.Work', blank=True, null=True, on_delete=models.CASCADE),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='track',
|
model_name='track',
|
||||||
name='work',
|
name='work',
|
||||||
field=models.ForeignKey(related_name='tracks', to='music.Work', blank=True, null=True),
|
field=models.ForeignKey(related_name='tracks', to='music.Work', blank=True, null=True, on_delete=models.CASCADE),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -108,7 +108,8 @@ def import_tracks(instance, cleaned_data, raw_data):
|
||||||
|
|
||||||
class Album(APIModelMixin):
|
class Album(APIModelMixin):
|
||||||
title = models.CharField(max_length=255)
|
title = models.CharField(max_length=255)
|
||||||
artist = models.ForeignKey(Artist, related_name='albums')
|
artist = models.ForeignKey(
|
||||||
|
Artist, related_name='albums', on_delete=models.CASCADE)
|
||||||
release_date = models.DateField(null=True)
|
release_date = models.DateField(null=True)
|
||||||
release_group_id = models.UUIDField(null=True, blank=True)
|
release_group_id = models.UUIDField(null=True, blank=True)
|
||||||
cover = VersatileImageField(upload_to='albums/covers/%Y/%m/%d', null=True, blank=True)
|
cover = VersatileImageField(upload_to='albums/covers/%Y/%m/%d', null=True, blank=True)
|
||||||
|
@ -245,7 +246,12 @@ class Work(APIModelMixin):
|
||||||
|
|
||||||
|
|
||||||
class Lyrics(models.Model):
|
class Lyrics(models.Model):
|
||||||
work = models.ForeignKey(Work, related_name='lyrics', null=True, blank=True)
|
work = models.ForeignKey(
|
||||||
|
Work,
|
||||||
|
related_name='lyrics',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
url = models.URLField(unique=True)
|
url = models.URLField(unique=True)
|
||||||
content = models.TextField(null=True, blank=True)
|
content = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
|
@ -268,10 +274,21 @@ class Lyrics(models.Model):
|
||||||
|
|
||||||
class Track(APIModelMixin):
|
class Track(APIModelMixin):
|
||||||
title = models.CharField(max_length=255)
|
title = models.CharField(max_length=255)
|
||||||
artist = models.ForeignKey(Artist, related_name='tracks')
|
artist = models.ForeignKey(
|
||||||
|
Artist, related_name='tracks', on_delete=models.CASCADE)
|
||||||
position = models.PositiveIntegerField(null=True, blank=True)
|
position = models.PositiveIntegerField(null=True, blank=True)
|
||||||
album = models.ForeignKey(Album, related_name='tracks', null=True, blank=True)
|
album = models.ForeignKey(
|
||||||
work = models.ForeignKey(Work, related_name='tracks', null=True, blank=True)
|
Album,
|
||||||
|
related_name='tracks',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
work = models.ForeignKey(
|
||||||
|
Work,
|
||||||
|
related_name='tracks',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
musicbrainz_model = 'recording'
|
musicbrainz_model = 'recording'
|
||||||
api = musicbrainz.api.recordings
|
api = musicbrainz.api.recordings
|
||||||
|
@ -340,7 +357,8 @@ class Track(APIModelMixin):
|
||||||
|
|
||||||
|
|
||||||
class TrackFile(models.Model):
|
class TrackFile(models.Model):
|
||||||
track = models.ForeignKey(Track, related_name='files')
|
track = models.ForeignKey(
|
||||||
|
Track, related_name='files', on_delete=models.CASCADE)
|
||||||
audio_file = models.FileField(upload_to='tracks/%Y/%m/%d', max_length=255)
|
audio_file = models.FileField(upload_to='tracks/%Y/%m/%d', max_length=255)
|
||||||
source = models.URLField(null=True, blank=True)
|
source = models.URLField(null=True, blank=True)
|
||||||
duration = models.IntegerField(null=True, blank=True)
|
duration = models.IntegerField(null=True, blank=True)
|
||||||
|
@ -376,7 +394,8 @@ class TrackFile(models.Model):
|
||||||
|
|
||||||
class ImportBatch(models.Model):
|
class ImportBatch(models.Model):
|
||||||
creation_date = models.DateTimeField(default=timezone.now)
|
creation_date = models.DateTimeField(default=timezone.now)
|
||||||
submitted_by = models.ForeignKey('users.User', related_name='imports')
|
submitted_by = models.ForeignKey(
|
||||||
|
'users.User', related_name='imports', on_delete=models.CASCADE)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['-creation_date']
|
ordering = ['-creation_date']
|
||||||
|
@ -392,9 +411,14 @@ class ImportBatch(models.Model):
|
||||||
return 'finished'
|
return 'finished'
|
||||||
|
|
||||||
class ImportJob(models.Model):
|
class ImportJob(models.Model):
|
||||||
batch = models.ForeignKey(ImportBatch, related_name='jobs')
|
batch = models.ForeignKey(
|
||||||
|
ImportBatch, related_name='jobs', on_delete=models.CASCADE)
|
||||||
track_file = models.ForeignKey(
|
track_file = models.ForeignKey(
|
||||||
TrackFile, related_name='jobs', null=True, blank=True)
|
TrackFile,
|
||||||
|
related_name='jobs',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
source = models.URLField()
|
source = models.URLField()
|
||||||
mbid = models.UUIDField(editable=False)
|
mbid = models.UUIDField(editable=False)
|
||||||
STATUS_CHOICES = (
|
STATUS_CHOICES = (
|
||||||
|
|
|
@ -22,7 +22,7 @@ class Migration(migrations.Migration):
|
||||||
('name', models.CharField(max_length=50)),
|
('name', models.CharField(max_length=50)),
|
||||||
('is_public', models.BooleanField(default=False)),
|
('is_public', models.BooleanField(default=False)),
|
||||||
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='playlists')),
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='playlists', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
|
@ -33,9 +33,9 @@ class Migration(migrations.Migration):
|
||||||
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
|
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
|
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
('position', models.PositiveIntegerField(db_index=True, editable=False)),
|
('position', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
('playlist', models.ForeignKey(to='playlists.Playlist', related_name='playlist_tracks')),
|
('playlist', models.ForeignKey(to='playlists.Playlist', related_name='playlist_tracks', on_delete=models.CASCADE)),
|
||||||
('previous', mptt.fields.TreeOneToOneField(null=True, to='playlists.PlaylistTrack', related_name='next', blank=True)),
|
('previous', mptt.fields.TreeOneToOneField(null=True, to='playlists.PlaylistTrack', related_name='next', blank=True, on_delete=models.CASCADE)),
|
||||||
('track', models.ForeignKey(to='music.Track', related_name='playlist_tracks')),
|
('track', models.ForeignKey(to='music.Track', related_name='playlist_tracks', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-playlist', 'position'),
|
'ordering': ('-playlist', 'position'),
|
||||||
|
|
|
@ -7,7 +7,8 @@ from mptt.models import MPTTModel, TreeOneToOneField
|
||||||
class Playlist(models.Model):
|
class Playlist(models.Model):
|
||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50)
|
||||||
is_public = models.BooleanField(default=False)
|
is_public = models.BooleanField(default=False)
|
||||||
user = models.ForeignKey('users.User', related_name="playlists")
|
user = models.ForeignKey(
|
||||||
|
'users.User', related_name="playlists", on_delete=models.CASCADE)
|
||||||
creation_date = models.DateTimeField(default=timezone.now)
|
creation_date = models.DateTimeField(default=timezone.now)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -21,9 +22,18 @@ class Playlist(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class PlaylistTrack(MPTTModel):
|
class PlaylistTrack(MPTTModel):
|
||||||
track = models.ForeignKey('music.Track', related_name='playlist_tracks')
|
track = models.ForeignKey(
|
||||||
previous = TreeOneToOneField('self', blank=True, null=True, related_name='next')
|
'music.Track',
|
||||||
playlist = models.ForeignKey(Playlist, related_name='playlist_tracks')
|
related_name='playlist_tracks',
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
previous = TreeOneToOneField(
|
||||||
|
'self',
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
related_name='next',
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
playlist = models.ForeignKey(
|
||||||
|
Playlist, related_name='playlist_tracks', on_delete=models.CASCADE)
|
||||||
|
|
||||||
class MPTTMeta:
|
class MPTTMeta:
|
||||||
level_attr = 'position'
|
level_attr = 'position'
|
||||||
|
|
|
@ -20,7 +20,7 @@ class Migration(migrations.Migration):
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||||
('radio_type', models.CharField(max_length=50)),
|
('radio_type', models.CharField(max_length=50)),
|
||||||
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('user', models.ForeignKey(related_name='radio_sessions', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
|
('user', models.ForeignKey(related_name='radio_sessions', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
|
@ -28,8 +28,8 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||||
('position', models.IntegerField(default=1)),
|
('position', models.IntegerField(default=1)),
|
||||||
('session', models.ForeignKey(to='radios.RadioSession', related_name='session_tracks')),
|
('session', models.ForeignKey(to='radios.RadioSession', related_name='session_tracks', on_delete=models.CASCADE)),
|
||||||
('track', models.ForeignKey(to='music.Track', related_name='radio_session_tracks')),
|
('track', models.ForeignKey(to='music.Track', related_name='radio_session_tracks', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('session', 'position'),
|
'ordering': ('session', 'position'),
|
||||||
|
|
|
@ -15,7 +15,7 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='radiosession',
|
model_name='radiosession',
|
||||||
name='related_object_content_type',
|
name='related_object_content_type',
|
||||||
field=models.ForeignKey(null=True, to='contenttypes.ContentType', blank=True),
|
field=models.ForeignKey(null=True, to='contenttypes.ContentType', blank=True, on_delete=models.CASCADE),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='radiosession',
|
model_name='radiosession',
|
||||||
|
|
|
@ -7,11 +7,20 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from funkwhale_api.music.models import Track
|
from funkwhale_api.music.models import Track
|
||||||
|
|
||||||
class RadioSession(models.Model):
|
class RadioSession(models.Model):
|
||||||
user = models.ForeignKey('users.User', related_name='radio_sessions', null=True, blank=True)
|
user = models.ForeignKey(
|
||||||
|
'users.User',
|
||||||
|
related_name='radio_sessions',
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
session_key = models.CharField(max_length=100, null=True, blank=True)
|
session_key = models.CharField(max_length=100, null=True, blank=True)
|
||||||
radio_type = models.CharField(max_length=50)
|
radio_type = models.CharField(max_length=50)
|
||||||
creation_date = models.DateTimeField(default=timezone.now)
|
creation_date = models.DateTimeField(default=timezone.now)
|
||||||
related_object_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
|
related_object_content_type = models.ForeignKey(
|
||||||
|
ContentType,
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
related_object_id = models.PositiveIntegerField(blank=True, null=True)
|
related_object_id = models.PositiveIntegerField(blank=True, null=True)
|
||||||
related_object = GenericForeignKey('related_object_content_type', 'related_object_id')
|
related_object = GenericForeignKey('related_object_content_type', 'related_object_id')
|
||||||
|
|
||||||
|
@ -43,9 +52,11 @@ class RadioSession(models.Model):
|
||||||
return registry[self.radio_type](session=self)
|
return registry[self.radio_type](session=self)
|
||||||
|
|
||||||
class RadioSessionTrack(models.Model):
|
class RadioSessionTrack(models.Model):
|
||||||
session = models.ForeignKey(RadioSession, related_name='session_tracks')
|
session = models.ForeignKey(
|
||||||
|
RadioSession, related_name='session_tracks', on_delete=models.CASCADE)
|
||||||
position = models.IntegerField(default=1)
|
position = models.IntegerField(default=1)
|
||||||
track = models.ForeignKey(Track, related_name='radio_session_tracks')
|
track = models.ForeignKey(
|
||||||
|
Track, related_name='radio_session_tracks', on_delete=models.CASCADE)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ('session', 'position')
|
ordering = ('session', 'position')
|
||||||
|
|
Loading…
Reference in New Issue