Django - Przypisanie wartości z innej klasy modelu

0

Hej
Oto bardzo uproszczona forma kodu
models.py

class UserP(models.Model):
    objects = None
    user = models.OneToOneField(User, primary_key=True, verbose_name='user', related_name='profile', on_delete=models.CASCADE)
    name = models.CharField(max_length=30, blank=True, null=True, unique=True)

class Post(models.Model):
    body = models.TextField()
    created_on = models.DateTimeField(default=timezone.now)
    author = UserP.name

Chciałem przypisać do zmiennej author w klasie Post wartości z innej klasy(UserP.name)

Podczas migracji pojawia się informacja

- Remove field author from post

i baza danych się wysypuje.

Jak przypisać name do author?

2

To albo podpinasz pod author poprzez Foreign Key całe UserP, potem możesz wyciągać post.author.name, albo wyciągnij name do osobnej klasy i podepnij pod UserP.name i Post.author, też używając Foreign Key

3

Najbardziej sensownym rozwiązaniem jest stworzenie relacji pomiędzy authorem i userem tak jak wspomniał @Arthan. Robienie z tego stringa znacznie utrudni ewentualne działania w przyszłości jak np filtrowanie itp. Jeśli bardzo chcesz imię autora to zawsze możesz stworzyć dodatkową metodę w modelu Post :

def author_name(self):
      return self.author.name ## zakładając, że pole author to model.ForeignKey
0

Zastosowałem poradę żeby podłączyć do Foreign Key całe UserP.
Wszystko działa oprócz dodania wpisu. (dodawania postu)

Models.py

class UserP(models.Model):
    objects = None
    user = models.OneToOneField(User, primary_key=True, verbose_name='user', related_name='profile', on_delete=models.CASCADE)
    name = models.CharField(max_length=30, blank=True, null=True, unique=True)
    bio = models.TextField(max_length=500, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    location = models.CharField(max_length=100, blank=True, null=True)
    picture = models.ImageField(upload_to='uploads/profile_pictures/', default='uploads/profile_pictures/default.png', blank=True)
    followers = models.ManyToManyField(User, blank=True, related_name='followers')


class Post(models.Model):
    body = models.TextField()
    created_on = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(UserP, on_delete=models.CASCADE)

views.py

...
 def post(self, request, *args, **kwargs):
        posts = Post.objects.all().order_by('-created_on')
        form = PostForm(request.POST)

        if form.is_valid():
            new_post = form.save(commit=False)
            new_post.author = request.user
            new_post.save()

...

zamieniłem na

            new_post.author.pk = request.user.pk

i zgłasza błąd RelatedObjectDoesNotExist at /social/
Post has no author.

Dodam tylko że w template post.author.pk działa poprawnie

edit.

        new_post.author = request.user

Zgłasza błąd
ValueError at /social/
Cannot assign "<SimpleLazyObject: <User: look>>": "Post.author" must be a "UserP" instance.

0

request.user to nie UserP, co Ty za maniane odwalasz, tutorial zrobił? W author ma być author = models.ForeignKey(User , on_delete=models.CASCADE) a nie UserP zaobacz sobie jak się robi

https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#referencing-the-user-model
https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

Chyba że zle widze Panowie i Panie?

Co Ty tam zmanagerm kombinujesz na None? Na tym etapie to wątpie że wiesz co robisz objects = None

1 użytkowników online, w tym zalogowanych: 0, gości: 1