zu schaffen habe ich die Aufgabe Modell:automatisch Tag-Objekte erstellen, wenn ein Objekt, Django REST-Framework
class Task(models.Model):
name = models.CharField(max_length=200, blank=True)
description = models.TextField(max_length=1000, blank=True)
completed = models.BooleanField(default=False)
date_created = models.DateField(auto_now_add=True)
due_date = models.DateField(null=True, blank=True)
date_modified = models.DateField(auto_now=True)
tasklist = models.ForeignKey(Tasklist, null=True, related_name='tasks', on_delete=models.CASCADE)
tags = models.ManyToManyField(TaskType, related_name='tasks')
und Klasse Tasktype (tag mit anderen Worten):
class TaskType(models.Model):
name = models.CharField(max_length=200)
Ich habe auch TaskSerializer:
Wenn ich eine Aufgabe erstellen, um einige Tags hinzuzufügen, muss ich sie zuerst in der entsprechenden Ansicht erstellen, aber ich möchte, dass sie spontan erstellt werden. So im Falle der Aufgabe bearbeiten, habe ich update
Methode:
def update(self, request, *args, **kwargs):
instance = self.get_object()
tag_names = request.data.get('tags', [])
for tag_name in tag_names:
tag, created = TaskType.objects.get_or_create(name=tag_name)
instance.tags.add(tag)
serializer = self.serializer_class(instance=instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
Es funktioniert gut, aber wenn ich hinzufügen, neue Tags, wenn Erstellen einer neuen Aufgabe es (400 Bad Request) ausfällt:
{
"tags": [
"Object with name=%new_tag% does not exist."
]
}
ich finde heraus, dass es ein guter Weg sein würde, damit vor dem erstellen Aufgabe entsprechendes Tag-Objekt zu erstellen, so dass ich hinzugefügt perform_create
Methode:
def perform_create(self, serializer):
print('debug')
tag_names = self.request.data.get('tags', [])
for tag_name in tag_names:
tag, created = TaskType.objects.get_or_create(name=tag_name)
list_id = self.kwargs.get('list_id', None)
try:
tasklist = Tasklist.objects.get(pk=list_id)
except Tasklist.DoesNotExist:
raise NotFound()
serializer.save(tasklist=tasklist)
Es hilft mir nicht, eigentlich bin ich mir nicht sicher, ob die perform_create-Methode zumindest aufgerufen wird, weil ich in der Konsole keinen Ausdruck ('debug') sehe (wenn ich Task mit einem vorhandenen Tag erzeuge, sehe ich es). Die Frage ist also, wie man die Methode perform_create ändert, um neue Aufgaben erstellen zu können, ohne zuerst das Tag zu erstellen.
Grundsätzlich ist Ihre Methode zum Bearbeiten der Aufgabe (put-Methode), ich muss neue Tags beim Erstellen neuer Aufgabe angeben. –
Wie denkst du, die Tags zu spezifizieren? Schicken Sie die tag_names über request.data ['tags'] ?? Ich verstehe nicht ganz, was Ihre Anforderung ist .. – zaidfazil
Ich sende POST zu einer Task-Ansicht wie folgt: {"Tags": ["Tag1", "Tag2", ...], "Name": "Name", .. .} –